检查输入和标准错误

标签 c input printf stderr

我正在尝试编写将从标准输入读取整数并打印其 gcd 的程序。如果两个整数都是素数,我打印 "prime"。在结束程序打印到 stderr - "DONE" 之前。当用户输入错误数据时,我想打印到 stderr - "ERROR"。所以我写了这段代码:

#include "stdio.h"
#include "nd.h"
#include "nsd.h"

int main() {
    int in1, in2;
    int tmp;
    while (1) {
        tmp = scanf("%d %d", &in1, &in2);
        if (tmp == EOF) {
            fprintf(stderr, "DONE\n");
            break;
        }
        if (tmp != 2) {
            fprintf(stderr, "ERROR\n");
        } else if ((nd(in1) == 1) && (nd(in2) == 1)) printf("prime\n");
                    // nd(int a) return 1 when a is prime  
                else printf("%d\n", gcd(in1, in2));
    }
    return 0;
}

我想在 “ERROR” 之后继续工作。但它不起作用,我尝试在 fprintf(stderr, "ERROR\n"); 之后添加 continue;,但它也不起作用。所以,我想:

- program run
5 10
5
1 3 
prime
1 0.9
error
// not break here!
10 2 
2
...
//EOF
DONE
- program stop

一切正常,除了"ERROR",我有这个:

- program run
5 0.9
ERROR
ERROR
ERROR
ERROR
...
//never stop

我知道在循环周期中它是正确的工作。我的问题是我必须改变什么才能从“我拥有的”切换到“我想要的”。

最佳答案

scanf() 在尝试处理意外输入时遇到问题。相反,使用 fgets()

读取
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) {
  fprintf(stderr, "DONE\n");
  break;
}
if (sscanf(buf, "%d%d", &in1, &in2) != 2) {
  fprintf(stderr, "ERROR\n");
} else if ((nd(in1) == 1) && (nd(in2) == 1)) {
  printf("prime\n");
} else {
  printf("%d\n", gcd(in1, in2));
}

修改代码以查找行中的额外文本。

// if (sscanf(buf, "%d%d", &in1, &in2) != 2) {
//   fprintf(stderr, "ERROR\n");
int n = 0;
if (sscanf(buf, "%d%d %n", &in1, &in2, &n) != 2 || buf[n]) {
  fprintf(stderr, "ERROR\n");
} ...

关于检查输入和标准错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467728/

相关文章:

c - mpz_set_str 将 0 设置为 mpz_t

matlab - 在 Matlab 中运行时获取用户输入

css - 使用css不显示文本框

c - 为什么我的 C 程序在 printf 之前停止?

c - 打印多个整数输出 0

c - 将输入文件名保存为字符串? C

c++ - C++ 应用程序中的静态数据内存限制

c - 如何获取 fork() 中的 execvp 错误?

jQuery 添加和删除文本框

创建函数 foo(...) 的 C 语法