2013-09-16 18 views
1

我遇到了strcat()函數的問題。請解釋我該如何運作。在strcat函數中自動附加字符串

char a[] = "AT"; 
char x[] = "KA"; 
char y = 'X'; 
sen(a); 
s = strcat(a, "+CMGF="); 
sen(s); 
s = strcat(s, "\r\n"); 
sen(s); 
s = strcat(s, &y); 
sen(s); 
getch(); 
return 0; 

S是glopal字符指針&仙()是剛剛打印的包含字符串的數據的功能。現在s的最終值是「AT + CMGF = \ r \ nXKA」。

它會自動追加x數組中的最後一個,儘管我沒有編寫它的代碼。

這是爲什麼?請解釋我

+5

你不確定的行爲。你的程序做什麼不應該擔心。 – chris

+0

這顯然是一個未定義的行爲 –

+2

您已經分配了大小爲3的數組,並且它們的級聯超出了它所能容納的範圍。這對於未定義的行爲至關重要。 – legends2k

回答

4

你處於未定義行爲的境界。更具體地講,它是什麼做的是這樣的:

char a[] = "AT"; 
char x[] = "KA"; 
char y = 'X'; 
s = strcat(a, "+CMGF="); // a is a constant string, so this is NOT fine. You should be calling s = strcat(s, a) and then s = strcat(s, "+CMGF=") 
s = strcat(s, "\r\n"); // "\r\n" = "\r\n\0", so it is also fine 
s = strcat(s, &y); // y is a char, and is NOT null-terminated, so it is NOT fine 

正巧您使用放置y和記憶的部分x並排編譯器,所以strcat運行,直到它找到的第一個空終止子。所有這一切都假設s有足夠的空間分配給它來保存所有這些連接(如果沒有,則處於另一個未定義行爲的領域)。

要糾正你的所有已知問題:

char s[100] = {0}; // showing declaration of s of sufficient size 
char a[] = "AT"; 
char x[] = "KA"; 
char y[] = "X"; 

sen(s); // shows empty string 
s = strcat(s, a); // append a to empty s 
s = strcat(s, "+CMGF="); // append "+CMGF=" to the end of new s 
sen(s); // will now show "AT+CMGF=" 
s = strcat(s, "\r\n"); // add "\r\n" 
sen(s); // will now show "AT+CMGF=\r\n" 
s = strcat(s, y); // append y 
sen(s); // will now show "AT+CMGF=\r\nX" 
+0

感謝大家幫我解決這個問題。非常感謝。 –

5

char a[] = "AT"將創建一個長度恰好爲3個字符的字符串。當你strcat其他的東西,它寫入a變量後的內存。這恰好是x之前的一些未使用的空間。 [從技術上講,當你寫外部空間a時會發生什麼情況是未定義的行爲,並且絕對不能保證xKA實際上只是距a的精確距離,或者代碼沒有以某種方式崩潰 - 未定義的行爲意味着C++標準沒有解釋將發生什麼,並且編譯器和/或運行時庫允許在這種行爲期間以某種其他方式「不符合你的期望」的方式崩潰或行爲 - ANYTHING that your系統可能可以做UB被調用時允許]

請確保目標字符串a是足夠大來容納您的字符串,並且您不會有這個問題。

+0

我認爲你的意思是目標字符串's',而不是'a'。他用's'存儲所有這些。 –

+1

不,'s' =='a',因爲'strcat'返回目標字符串。 –

+0

不,他指出's'是一個全局字符指針(因此,它不同於'a' - 'a'是一個指向常量字符串的指針)。也就是說,如果他按原樣離開他的第一個'strcat',他會寫信給未申報的記憶。 's'必須被宣佈爲足夠整個操作...「a」沒問題,只要他不寫信給他,就像他在第一個'strcat'中所做的那樣。 –