繁体   English   中英

scanf()的返回值

[英]Return value of scanf()

这是我的代码重复读取由用户的空格分隔的三个变量。 输入格式应为'char int int'(例如b 3 3)。 我使用scanf函数的返回值来确保输入正好是三个变量。

#include <stdio.h>

int main(void){
  int x, y, nargs;
  char command;

  while(1){
    nargs = scanf("%c %d %d", &command, &x, &y);
    printf("%d\n",nargs);

    if(nargs != 3){
      printf("error\n");
      break;
    }
  }
  return 0;
}

输入和输出:

g 4 4
3
b 3 3
1
error

第一行输入没问题。 但是当我输入第二行时,它显示scanf()仅从该行读取一个变量。 我的代码有什么问题?

问题是在您发送到stdin的两条输入行之间隐藏的\\n换行符。 在第一次scanf之后,输入流上将有一个'\\n'待处理,然后附加"b 3 3"这样整个缓冲区看起来就像是"\\nb 3 3"

然后,在scanf需要空格但缓冲区具有'b'后,再次调用scanf并将\\n%c匹配,因此缓冲区在将\\n分配给command之后失败。

你可以尝试匹配

nargs = scanf("%c %d %d ", &command, &x, &y);
                       ^

因此换行符与先前的scanf一起被cppreference占用

格式字符串中的任何单个空格字符都会使用输入中的所有可用连续空白字符

nargs = scanf("%1s %d %d", &command, &x, &y);

问题在于一个字符的%c 如果你为%1s更改它,你期望一个字符串(相同),但没有问题。

使用%c ,最好将结果发送到数组,并使用其索引访问内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM