【问题标题】:C Scanf suddenly stopped reading in valuesC Scanf 突然停止读取值
【发布时间】:2013-06-04 09:20:18
【问题描述】:

我正在尝试在我的 Mac 上运行一个简单的 C 程序。它工作了一段时间,但突然 scanf 停止工作。我基本上想读入一个整数值并输出输入的内容。无论我输入的整数如何,程序都会输出 0。我已经尝试了建议here,但没有任何效果。我已经尝试在终端和 xcode 中运行该程序,但仍然没有。有什么想法吗?

#include <stdio.h>

int main(){
  int numberOfElements = 0;
  scanf("Number of elements: %d",&numberOfElements);
  printf("%d\n",numberOfElements); //keeps returning 0 no matter the number I enter
  return 0;
}

【问题讨论】:

  • 记得检查scanf()(或任何该系列函数)的返回值。除非您键入 Number of elements: 23456 或类似的东西,否则它将返回 0。事实上,您需要(实际上)检查每个输入操作以确保其正常工作。假设它有效,迟早会导致问题。

标签: c integer printf scanf


【解决方案1】:

当您在scanf/fscanf/sscanf 格式字符串中包含任何非格式字符时,这意味着您要求这些字符出现在输入流(或输入字符串,如果是sscanf )。如果输入中不存在这些字符,scanf 将失败。空格字符有特殊含义,导致scanf 跳过所有空格,但不需要任何空格。

所以,为了让这个scanf 成功

scanf("Number of elements: %d", &numberOfElements);

你必须输入,字面意思

Number of elements: 10

Numberof    elements:10

Numberofelements:    10

或类似的东西。 IE。您还必须输入单词Numberofelements:。如果您只输入10scanf 将失败,因为仅仅是10 与请求的格式不匹配。

我确定这不是您的意图。显然,您真正想做的是使用printf 打印提示,然后做一个简单的

scanf("%d", &numberOfElements);

scanf 的上述功能可能很有用,但可能仅在极少数情况下有用。这意味着,当您在scanf 格式字符串中看到任何非格式文本时,很有可能出现问题。

【讨论】:

  • 感谢大家的快速回复,所有答案都是正确的。 AudreyT 只是更深入地了解了这个问题。
【解决方案2】:

你必须打印提示,并且只扫描输入:

printf("Number of elements: ");
fflush(stdout);
scanf("%d", &numberOfElements);

一般来说,最好避免直接使用scanf()。相反,您可以获取一行输入,然后在检索到的字符串上使用sscanf() 以更好地控制错误。

char line[MAX_LINE];
if (fgets(line, sizeof(line), stdin) != NULL) {
    if (sscanf(line, "%d", &numberOfElements) != 1) {
        printf("You didn't input a number: %s", line);
        /* ... */
    }
}

【讨论】:

  • 您不需要 fflush 就在 scanf 之前。输出缓冲区由scanf 刷新。
  • @unxnut:我没有看到任何描述scanf() 刷新行为的文档。这是 POSIX 的东西吗?
【解决方案3】:

Number of elements: 不应包含在 scanf 语句中。您想将scanf 语句更改为:

printf ( "Number of elements: " );
scanf ("%d", &numberOfElements );

【讨论】:

  • 不喜欢括号周围的空间量......这是一个风格问题,但它不是传统的。查看 K&R 或 C 标准。
猜你喜欢
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多