在while循环中使用scanf读取数组时出现意外行为

时间:2014-12-11 07:52:15

标签: c arrays while-loop scanf

我写了一个程序来读取数字到整数数组a [100]。当用户输入一个角色时,阅读就会停止。或当数组达到最大大小时。

但是当代码运行时,我遇到了一个意想不到的行为,当用户进入' e'将数字扫描到数组中终止,就像我在程序中所预期的那样,但是循环中的其余语句包括增量变量(i ++)和printf函数我用来调试代码,直到第一个条件在内部,而条件部分变为假。

#include <stdio.h>

int main(){
int a[100];
puts("Enter numbers(enter \"e\" to stop entring)\n");
int i=0;
scanf("%d",&a[i]);
while(i<100&&a[i]!='e'){
     i++;;
     scanf("%d",&a[i]);
     printf("\n -----> %d\n",i);
}
printf("\n\t i ---> %d\t\n",i);
return 0; 
}

2 个答案:

答案 0 :(得分:1)

我能想到的问题:

  1. 需要更新数组索引的递增。

    while(i<100&&a[i]!='e'){
         // When i 99 before this statement, i becomes 100 after the increment
         i++;;
         // Now you are accessing a[100], which is out of bounds.
        scanf("%d",&a[i]);
        printf("\n -----> %d\n",i);
    }
    

    你需要的是:

    while(i<100&&a[i]!='e'){
        scanf("%d",&a[i]);
        printf("\n -----> %d\n",i);
        i++;;
    }
    
  2. 如果您的输入流包含e,则声明

    scanf("%d",&a[i]);
    

    没有读到任何内容a[i]

    你可以通过以下方式解决这个问题:

    1. 以字符串形式阅读输入。
    2. 检查字符串是否为e。如果是这样的话,就要摆脱循环。
    3. 如果没有,请尝试从字符串中获取数字。
    4. 这是一个更新版本:

      char token[100]; // Make it large enough 
      while(i<100) {
          scanf("%s", token);
          if ( token[0] == 'e' ) // Add code to skip white spaces if you 
                                 // want to if that's a possibility.
          {
             break;
          }
          sscanf(token, "%d", &a[i]);
          printf("\n -----> %d\n",i);
          i++;;
      }
      

答案 1 :(得分:0)

每当使用scanf()系列函数时,请务必检查返回值。 (@ user694733)

使用scanf("%d",&a[i]);阅读&#34; e&#34;失败,scanf()返回0表示没有发生转换。 &#34; E&#34;保留在stdin中,直到可以正确读取,从不使用OP的代码,阻止后续输入。

将用户输入作为字符串读取,测试是否&#34; e&#34;,否则转换为int

int main(void) {
  int a[100];
  puts("Enter numbers(enter \"e\" to stop entering)\n");
  int i = 0;
  for (;;) {
    char buf[50];
    if (fgets(buf, sizeof buf, stdin) == NULL) {
      break;  // Input was closed
    }
    if (strcmp(buf, "e\n") == 0) {
      break; // normal method to stop entering.
    }
    if (sscanf(buf, "%d", &a[i]) != 1) {  // or use strtod()
      break; // Some other garbage entered.
    }
    printf("\n -----> %d %d\n", i, a[i]);
    i++;  // increment afterwards @R Sahu
  }
  printf("\n\t i ---> %d\t\n",i);
  return 0; 
}

注意:建议不要使用scanf()