【C語言細節】關於格式化輸入%s的那些事

問題

寫出下面代碼運行結果:

#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接收字符串,遇空格停止接收

接收
p
abc
q

第二步:q接收字符串,並覆蓋原有的值

接收
p
def
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。

發佈了59 篇原創文章 · 獲贊 44 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章