c:scanf读取整数

时间:2018-01-17 05:04:17

标签: c scanf

这个scanf语句将从输入中读取数字10ss为10 - 如何重写它以忽略其后跟随其他字符的int?如果读取10ss,则应忽略它并停止for循环。

for (int i = 0; scanf("%d", &val)==1; i++)

2 个答案:

答案 0 :(得分:4)

您可以尝试阅读下一个角色并进行分析。

的内容
int n;
char c;
for (int i = 0; 
     (n = scanf("%d%c", &val, &c)) == 1 || (n == 2 && isspace(c)); 
     i++)
  ...

// Include into the test whatever characters you see as acceptable after a number 

或者,试图创造“发烧友”的东西

for (int i = 0; 
     scanf("%d%1[^ \n\t]", &val, (char[2]) { 0 }) == 1; 
     i++)
  ...

// Include into the `[^...]` set whatever characters you see as acceptable after a number 

但总的来说,你很可能会很快遇到scanf的限制。最好将输入作为字符串读取,然后对其进行解析/分析。

答案 1 :(得分:0)

  

如何重写它以忽略后面跟着其他字符的int

强大的方法是使用fgets()读取,然后解析它。

// Returns
//   1 on success
//   0 on a line that fails
//   EOF when end-of-file or input error occurs.
int read_int(int *val) {
  char buf[80];
  if (fgets(buf, sizeof buf, stdin) == NULL) {
    return EOF;
  }
  // Use sscanf or strtol to parse.
  // sscanf is simpler, yet strtol has well defined overflow funcitonaitly
  char sentinel;  // Place to store trailing junk
  return sscanf(buf, "%d %c", val, &sentinel) == 1;
}


for (int i = 0; read_int(&val) == 1; i++)

检测过长行所需的附加代码。