【问题标题】:Using scanf to scan multiple chars and ints at once使用 scanf 一次扫描多个字符和整数
【发布时间】:2025-11-30 21:50:02
【问题描述】:

问题似乎比较直接和基本。似乎以前会被问过,但我使用搜索引擎找不到任何东西。几乎我需要用户输入多个变量,然后我将其存储在一次扫描中。我是 C 的新手,所以我不确定为什么这不起作用。我知道这是新手,但作为 C 的新手我不确定。

用户几乎会输入“* 2 4”之类的内容,但由于某种原因,变量值在下一个方法中永远不会改变。

即使我在扫描后立即输入printf("Values are %d and %d", &start, &end);,值仍然不会改变。

char symb;
int start, end;
printf("Enter a symbol, a start point, and an end point : ");
scanf("%c %d %d", &symb, &start, &end);
do_function(symb, start, end);

【问题讨论】:

  • 这里的symb 是什么?提供 do_function() 正文
  • “我无法使用搜索引擎找到任何东西”——然后阅读您要使用的功能的手册页(或其他一些文档)。
  • 抱歉,这只是一个复制错误。我修好了它。 do_function 只打印出符号、开始和结束的值。但值永远不会从扫描功能改变

标签: c scanf


【解决方案1】:

您可以通过检查scanf()的返回值来检查它是否成功;如果它没有返回3,您的代码将无法继续,因为这些值没有被扫描。

【讨论】:

  • 在我的 do_function 方法中,它打印出传递的变量的值,并且它们永远不会从扫描函数中改变,所以这就是为什么我在这里问我做错了什么
【解决方案2】:

"%c" 之前添加空格以消耗前面的空格并检查scanf() 结果。

if (scanf(" %c %d %d", &symb, &start, &end) != 3) {
  puts("Bad input");
  exit (-1);
}

scanf("%c %d %d", &symb, &start, &end) 消耗 any char 并将其保存到 symb。通常这是上一行中的'\n'。然后读取数字的尝试被'*' 停止。

更好的方法是读取整行,然后扫描。

char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_IOErrorOrEOF();
if (sscanf(buf, " %c %d %d", &symb, &start, &end) != 3) {
  puts("Bad input");
  exit (-1);
}
do_function(symb, start, end);

注意:" %c %d %d" 可以是 " %c%d%d",因为除了 "%c""%n""%[" 之外的所有说明符都会占用前导空格,即使没有前导 " "

【讨论】:

    【解决方案3】:

    发现我的打印方法有问题(在不需要时使用&符号)

    【讨论】: