2010-11-15 38 views
1

聲明一個字符串我要聲明一個字符串,將舉行4個字符奇怪的值,當我用C

char st[4]; 
memcpy(st,"test",4); 

,但是當我打印ST ...我有「測試」,並在其後的印刷一些其他符號 - 那有什麼不對?

非常感謝

回答

11

C字符串,如"test"字符串常量,是NULL結尾的,這意味着最後一個字符是 '\ 0':

{'t', 'e', 's', 't', '\0'} 

您將需要使用st[5],和複製5個字符,爲NUL留出空間(包括)。因爲你沒有將它包含在副本中。所以aftewards,st樣子:

{'t', 'e', 's', 't', X, X, X ... '\0'} 

打印時,C一直是不約而同地在內存中(上述X'es),直到找到一個NUL閱讀的亂碼值。

最好的解決辦法是消除memcpy,並讓您的初始化編譯器弄清楚大小:

char st[] = "test"; 

sizeof(st)現在是5

2

如果你真的想使用memcpy(),你還必須複製終止空字節:

char st[5]; 
memcpy(st, "test", 5); 

記住,在內存中"test"看起來像這樣:

74 65 73 74 00 
t e s t \0 

這就是爲什麼你必須複製5個字節。

如果不復制空字節,即對空工作職能終止字符串,如printf(),會讀取內存,直到他們達到一定的隨機空字節...

2

如果出於某種奇怪的原因要保持你的代碼是,請執行下列操作:

char st[4]; 
memcpy(st,"test",4); 
int i; 
for(i = 0; i < 4; i++) 
    printf("%c",st[i]); 

現在它將會打印OK的。但閱讀其他答案,看看你的編程是不正確的。