問題
寫出下面代碼運行結果:
#include <stdio.h>
#include <stdlib.h>
int main(){
char *p,*q;
p=(char*)malloc(20*sizeof(char));
q = p;
scanf("%s%s",p,q);
printf("%s%s",p,q);
return 0;
}
當輸入
abc def⤶(回車)
時,輸出的結果是什麼?
答案是:defdef
分析
scanf("%s%s",p,q);
這裏的%s
指輸入字符串,以非空白字符開始,遇到空白字符結束。
當p接收完abc
後,遇到空格,則結束,緊接着def
送到q中。又由於p和q共用一段內存,因此當q接收了def
後,這段內存中的數便由abc
更新成了def
,所以輸出的p和q,相當於把這一段內存中的數輸出兩次,即defdef
圖示:
整個過程相當於對這一塊內存空間進行賦值:
第一步:p接收字符串,遇空格停止接收
第二步:q接收字符串,並覆蓋原有的值
第三步:輸出p,q
啊懂?
另外,如果是scanf("%c%c%c",&c1,&c2,&c3);
我應該輸入
abc⤶(回車)
(字符間無空格)
來對c1,c2,c3賦值,但如果我輸入了
a b c⤶(回車)
(字符間有空格)
會怎樣呢?
這時系統會把第一個字符‘a’送給c1,把第二個空格字符’ '送給c2,第三個字符‘b’送給c3。而不是把‘a’送給c1,把’b’送給c2,把’c’送給c3。