gcc 为什么这个函数是无限循环的?

mwngjboj  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(98)

这个函数只是停留在一个循环中,而我的用户没有输入正确的输入(在这种情况下是一个整数)。无限循环发生时,用户输入错误的值(如字符串)。但为什么会发生这种情况?如何修复?

int main(void) {
  int colQty;
  int result = 0;
  while (result != 1) {
    printf("Informe a quantidade de colunas: ");
    result = scanf("%d", &colQty);
    if (result != 1) {
      printf("Erro! Verifique se os valores de entrada estão certos.");
    }
  }

  return 0;
}

字符串

zdwk9cvp

zdwk9cvp1#

scanf在错误的输入上停止,并不跳过它。您的代码将再次扫描相同的输入。通常,最好读取行,sscanf读取字符串。

char line[100];
printf("\nInforme a quantidade de colunas: ");
if(!fgets(line, sizeof(line), stdin)) {/* handle error */}
result = sscanf(line, "%d", &colQty);

字符串

lndjwyie

lndjwyie2#

正如 @gulpr 回答的那样,scanf()将违规输入留在了输入流中,因此下一次迭代将继续失败。同样的问题也会发生在文件末尾,例如,如果输入流从空文件重定向。
建议一次读取一行输入,并使用sscanf从该行解析用户输入。
以下是修改后的版本:

#include <stdio.h>

int main(void) {
    int colQty;

    for (;;) {
        char input[100];
        printf("Informe a quantidade de colunas: ");
        if (!fgets(input, sizeof input, stdin)) {
            printf("Error: no input\n");
            return 1;
        }
        if (sscanf(input, "%d", &colQty) == 1) {
            // conversion succeeded, proceed
            break;
        }
        printf("Error: input is not a number: %s", input);
    }
    printf("colQty: %d\n", colQty);
    return 0;
}

字符串

相关问题