我写了一个程序来读取数字到整数数组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;
}
答案 0 :(得分: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++;;
}
如果您的输入流包含e
,则声明
scanf("%d",&a[i]);
没有读到任何内容a[i]
。
你可以通过以下方式解决这个问题:
e
。如果是这样的话,就要摆脱循环。这是一个更新版本:
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()