2016-04-03 115 views
0

我在寫一個基本的c程序來顯示兩個字符串,一個來自用戶,即「a」,另一個在代碼「b」中定義,但是當我運行代碼下面的字符串「a」被附加到「b」。爲什麼?什麼是該符號在 「A」爲什麼字符串a被附加到此代碼中的字符串b

更新的代碼結束:

#include <stdio.h> 
#include <string.h> 
int main() 
{ 
char a[ 5 ]; 
int i=0; 

while(i<5) 

{ 
    a[i]=getchar(); 
    i++; 
    } 

    char b[]={'r','f','s','/0'}; 

printf("output:-"); 
    printf("\n %s",a); 
printf("\n %s",b); 
return 0; 

控制檯

qwert 

output:-qwert$ 

    rfs$qwert$ 

是有一些特殊的符號,而不是$以上,是什麼呢?

+1

'while(i <6)'在訪問'a [5]'時溢出了'a'緩衝區。 '5'是一個超出界限的指數。而且,C中的字符串需要'\ 0'('NUL')終止。哪個'a'和'b'不是。所以你不能把它們看作字符串(就像'%s'指令所做的那樣)。 – kaylum

+0

我做了以下更改: - 添加'/ 0'作爲b的最後一個元素,while(i <5)。仍然獲得相同的輸出。 – techvigil

+1

請更新您的問題以顯示實際的代碼。避免僅用言語描述代碼,因爲這幾乎總是含糊不清。例如,你或你沒有NUL終止'a'嗎?當它應該是''\ 0''時,你真的以''/ 0'終止嗎?不清楚。因此,請顯示確切的代碼,並且不會有任何疑問。 – kaylum

回答

1

將所有評論放入答案。原始代碼中的問題主要來自於不是NUL終止字符數組以產生有效的C字符串。

  • a不是NUL終止。可以通過將a數組加1並明確寫入最後一個字節的NUL來修復。
  • b不是NUL終止。可以通過使用文字字符串或'\0'作爲最後一個字節初始化b來修復。下面的例子使用前者。

以下是糾正錯誤的完整代碼。請注意,讀取輸入的代碼很脆弱,因爲它只接受5個字符的字符串。

#include <stdio.h> 
#include <string.h> 
int main(void) 
{ 
    char a[6]; 
    int i=0; 

    while (i<5) { 
     a[i]=getchar(); 
     i++; 
    } 
    a[i] = '\0'; 

    char b[]="rfs"; 

    printf("output:-\n"); 
    printf(" %s\n",a); 
    printf(" %s\n",b); 

    return 0; 
} 
相關問題