寫了三個小的幾乎一樣的test代碼,但是輸出卻不同,不明白為什麼,求大神指點。
全部代碼如下:
#include
void sub1(void);
int main()
{
/*test1*/
sub1();
/*test2 */
char w0[2]={'a','a'};
char * pc0 = w0;
printf("\nw1 = %s",w0); /*wrong*/
printf("\nw1 = %s",pc0); /*wrong*/
/*test3 */
char w1[2];
char * pc = w1;
printf("\n\nInput:");
scanf("%2s",w1); /*try input aa*/
printf("\nw1 = %s",w1); /*right*/
printf("\nw1 = %s",pc); /*right*/
return 0;
}
void sub1(void)
{
char w1[2];
char * pc = w1;
printf("\nInput:");
scanf("%2s",w1); /*try input aa*/
printf("\nw1 = %s",w1); /*right*/
printf("\nw1 = %s",pc); /*wrong*/
}
凡是scanf輸入的地方,都是輸入aa,然後回車。請問為何得到的結果,三個都不同。我在注釋裡標明了正常輸出的代碼和錯誤輸出的代碼。理論上3個實驗中,字符串都沒有用\0結尾,那麼為何有些能夠正常輸出?
題主這個問題問的好,我學的時候就沒有你這麼細心。
觀察一下就會發現,當需要手動輸入2個字符時,最後就不會出錯;
而初始化時賦值2個字符,輸出就會有問題。
我們繼續往後推:在命令行界面賦值和程序初始化賦值有什麼區別?
那就是:初始化只給定字符,沒有輸入結束標志(沒有'\0'),但手動輸入時,我們最後都會敲一個回車鍵('\n'),那麼在這裡,回車就代表了字符數組結束標志。
即便數組大小都被限定,但是字符數組的第一限制不是大小而是結束標志!