C语言基础问题

编程的时候遇到一些疑惑,看似简单,但经常把我害得很惨,主要是有关scanf和字符数组的问题。

(1)当scanf(“%d”,&a);的时候,后面的‘\n’被收进哪里去了呢?如果后面再来一句scanf("%c",&b);b会变成‘\n’吗?

(2)当scanf(“%c%c”,&a,&b);的时候,如果我是按空格来分割a与b,那b会变成空格吗?如果我是按换行键来分割a与b,那b会变成'\n'吗?如果下一句话还有输入字符,那么那个字符会变成b后面的'\n'吗?

(3)什么时候需要加上getchar()?scanf(“%c\n”,&a);和scanf(“%c%*c”,&a);和scanf(“%c”,&a);getchar();和scanf(“%c”,&a);getche();有什么区别?

(4)字符数组初始化的时候,如果我写char a[100]={0},那么a会全部变成null还是只有a[0]变化?为什么我写int a[100]={0}和int a[100]={'0'}的效果是一样的?'0'难道不应该将a初始化为字符‘0’吗?

(5)当我写a[0]='0'; a[0]=a[0]-'0';之后,a[0]会变成null吗?(因为我看到ascii码表上0对应空,但有时候我想让a[0]等于0这个数字,不想让它变为空怎么办?)

(6)while(~scanf("%d",&a))和while(scanf("%d",&a)!=eof)有什么区别?

(7)当我令int a[100]={0}时,是全部初始化为0还是只有a[0]变化?

(8)如果a是一个字符,我却要输出它的%d: printf(“%d”,a);那么会输出什么?a的ascii码值吗?

    '\n'没有消失,遗留在输入缓冲区;后面有scanf("%c", &b)的话,b就被赋与'\n'。

     用空格分割,b会变成空格;用回车分割,b会变成'\n';如果后面还有字符输入语句,就等待输入,因为输入缓冲区里这时没有数据了。

    当前面的输入语句把广义空格(' '、'\t'、'\n'等)遗留在输入缓冲区里,而后面又有字符输入语句时,要在后面的字符输入语句前加getchar()或接收字符的其他函数或清除输入缓冲区函数fflush(stdin)来清除掉遗留在输入缓冲区中的字符,以避免后面的字符接收函数错误接收。getchar()是函数getche()的变体之一,是早先UNIX下定义的。getchar()、getche()和scanf("%c",&x)都有差别:getchar()接收的'\n'是10,getche()接收的\n'是13,而scanf("%c",&x)不接收'\n'。这些细节全靠用多了记住,没有别的办法。scanf(“%c%*c”,&a)接收一个字符赋给a,紧接着再接收一个字符,但不赋给任何变量。

    char a[100]={0}; 将100个1字节元素全部赋0。你写“写int a[100]={0}和int a[100]={'0'}的效果是一样的”不可能:int a[100]={0};将100个int元素全赋0,而int a[100]={'0'};则将a[0]赋'0'即十进制48,后面99个全是0。

    a[0]会变成NULL, 因为NULL的定义就是0;“我想让a[0]等于0这个数字,不想让它变为空”做不到。因为0按数字解释就是0,而按字符解释就“空”——其实NULL、'\0'、0的定义都是十进制数0,只是NULL是系统定义的符号常量,常用于指针的无效状态,'\0'是用转义字符表示的常量,常用于字符串的结尾,而0就是数字0了——这样区分主要是为了方便代码的阅读,你可以试着把现成代码中的NULL、'\0'、0都换成三者之一,效果是一样的。

    一般没有区别,不过要看编译器对eof是怎么定义的。eof常见的是被定义为-1的,而~(-1)=0,所以二者才没有区别。

    全部初始化为0。

    是a的ASCII码值。

顺便说一句,输入输出函数是C的复杂库函数,有问题可以具体续问,在这里三言两语说不明白……

追问

你回答得好认真!太感谢了!但是看到你的解释,我又有了几个新问题1.为什么输入%d%d的时候就不会遇到这种问题,%d不接受'\n'吗?2.你在(3)里说“而scanf("%c",&x)不接收'\n'”,但难道不正是因为它总是接收'\n',才会有这么多问题吗?3.实在对不起那个(4)我写错了,我想写的是我初始化char a[100]时'0'和0好像没有区别,如果我想把a全部赋值为'0'该怎么办呢

追答

    你说对了,在%d控制下,scanf函数只接收数字,在遇到‘ ’、'\t'、'\n'等类间隔时“跳过”这些字符接收下一个数字并赋给下一个变量(如果有的话);但遇到其他非数字符号时则认为出错。

    那个说法不对。是想说canf("%c",&x)只接收一个字符并以'\n'作为结束符号,如当输入a回车时,x赋值是'a',不接收'\n','\n'被留在缓冲区里。少说了话,提交前未细检查,把你搞得有点糊涂了。canf("%c",&x)是接收字符的,'\n'也是字符,当然能被接收,值也是十进制10。

    无论初始化还是赋值,0和'0'都不一样,0就是0,'0'是十进制48,而0和'\0'是一样的,都是0。要想给char a[100];中的a数组全初始化为'0',最笨的就是char a[100]={'0','0',...}这样在{}中写100个'0';如果不想这么做,就得在代码中写个循环赋值'0',但这就不叫初始化而叫赋初值了。有个办法可以简单一些地初始化:#define N(x) x,x,x,x,x,x,x,x,x,x,然后char a[100]={N(N('0'))};应该就可以了……你试试。

追问

我这几天一直在做题,忘了采纳了|||感谢回答这么多~!!

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-03-01
(1) '\n'没有消失,后面scanf("%c", &b)的话,b会变成'\n'
(2) b会变成空格,b会变成'\n',反正%c是不会略过空格和换行的
(3) getchar()和scanf("%c")完全一样
(4) char a[100]={0} 全部变成0,
int a[100]={0} 全部变成0,
int a[100]={'0'} 第一个是'\0',后面全部是0

(5) a[0]会变成NULL, 因为NULL就是0
(6) 没有区别
(7) 全部变成0。
(8) 输出ASCII值
相似回答
大家正在搜