读书人

又哪错了?为什么运行后N的值是100?

发布时间: 2012-06-10 14:03:15 作者: rapoo

又哪错了?为什么运行后,N的值是100?

C/C++ code
#include <stdio.h>int main(void){    int a[100],i,n = 0;    printf("请为数组输入整数值,输入'/0'代表结束:\n");    for(i = 0; i < 100; i++)    {        scanf("%d",&a[i]);        if(a[i] == '/0') break;        else n++;    }    printf("%5d\n",n);    return 0;}


[解决办法]
不应该是100吗?
输入了100个数字,进入最后一次循环时,为99,然后执行n++则n为100。
[解决办法]
为什么不是100?
[解决办法]
楼主为什么会突发奇想,能够让a[i]=='/0' ???请问用整形来表示'/0'这个到底是多少??
我发现我输入'/0'的时候是停止不了的。因为根本不知道你的这个'/0'到底是什么值啊??
[解决办法]
为什么不是100啊。。。。
[解决办法]
当i为0时,n的值为1,当i的值为1时,n的值为2,...所以最后,i的值为99时,n的值就为100.
[解决办法]
试试:

C/C++ code
#include <stdio.h>int main(void){    int a[100],i,n = 0;    printf("请为数组输入整数值,输入'/0'代表结束:\n");    for (i = 0; i < 100; i++)    {        if ( scanf("%d", &a[i]) == 0)        break;        else        n++;    }    printf("%5d\n",n);    return 0;}
[解决办法]
当你输入\0字符时
scanf("%d",&a[i]);无法读取字符,因为%d只会取数字,所以'\','0'两个字符一直在输入缓冲区中,scanf("%d",&a[i]),虽然没有取到数字,但是依然会跳过,因为缓冲区有内容,但是获取失败,scanf还是执行过了,并进入下一条语句。之后进到下一次循环,因为此时缓冲区依然还有'\'和'0'的字符,所以又重复以上的过程,scanf获取失败进入下一次循环,之后一直到循环结束为止,最后一次n=99,n++之后变成100。正确的方式应该用6楼的,scanf()的返回值是成功读到变量的个数,如果没有读到会返回0,所以可以用
scanf()==0来做if判断。
而且只要你输入任何数字以外的字符,都会产生同样的效果。
如果你清除了缓冲区,就不会这样了,可以看看
C/C++ code
#include <stdio.h>int main(void){    int  a[100],i,n = 0;    printf("请为数组输入整数值,输入'/0'代表结束:\n");    for(i = 0; i < 100; i++)    {        scanf("%d",&a[i]);    scanf("%*[^\n]");//    scanf("%*c");//这两句清空缓冲区    printf("a[%d]=%d\n",i,a[i]);//如果你输入字符,会打印出随机初始的值。        if(a[i] == '/0') break;        else n++;    }    printf("%5d\n",n);    return 0;}
[解决办法]
因为你定义的数组是int型的,但是却输入的是字符,所以不能接收该字符!故跳出scanf语句,并没有进入到IF语句中(不信你可以随便输入一个字母Q,它同样是直接输出N==100),但是该字符却一直存在,所以会一直for下去,直到i=100.
可以做以下改进:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int a[100],i,n = 0;
printf("请为数组输入整数值,输入'/0'代表结束:\n");
for(i = 0; i < 100; i++)
{
if(!scanf("%d",&a[i]))
break;
else n++;
}
printf("%5d\n",n);
system("pause");
return 0;
}
不过这个方法会导致你无论输入什么字符都会退出SCANF语句!具体改进方法明天再想,今天想的太晚了!

读书人网 >C语言

热点推荐