2013-05-11 69 views
0

在這裏,在這個示例程序來說明strcpy()這種行爲,我寫了一個字符串"S"成一個更大的字符串previous其原來有"Delaware"。但這僅覆蓋影響原始字符串的原始string.The休息前兩個字符繼續具有相同的值。如何處理這個問題? (即使memcpy()似乎也可能具有相同的行爲)。我的意思是,如何將其餘字符轉換爲0?或者字符串中保留其原始值的其餘字符沒有副作用?將一個小字符串的strcpy()放入一個更大的字符串中,將剩下的更大的字符串保持不變。如何處理它?

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    char previous[10]="Delaware"; 
    printf("The character at position 4 is %c\n",previous[4]); 
    strcpy(previous,"S"); 
    printf("The character at position 4 later is %c",previous[4]); 
} 
+0

你爲什麼要把字符串的其餘部分改爲0? – yngccc 2013-05-11 03:31:04

+0

爲什麼會默認這樣做?這是一個字符串函數,字符串無論如何都不關心null終止符後面的內容,所以這只是大部分時間的浪費。 – chris 2013-05-11 03:31:53

+0

'strcpy'也會複製空終止符,所以如果你做了一個'printf(「%s \ n」,前一個);'它只會打印'S',這假定目的地足夠大以容納空終止符。 – 2013-05-11 03:31:56

回答

3

strcpy函數做到這一點:

previous     "S" 
    |     | 
    v     v 
-- -- -- -- -- -- -- -- -- -- -- - 
| D| e| l| a| w| a| r| e|\0| | | S|\0| 
-- -- -- -- -- -- -- -- -- -- -- -- 
^^       | | 
    | |       | | 
    | - - - - - - - - - - - - - - - - 
    |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| 

離開你的內存看起來像這樣:

-- -- -- -- -- -- -- -- -- -- -- - 
| S|\0| l| a| w| a| r| e|\0| | | S|\0| 
-- -- -- -- -- -- -- -- -- -- -- -- 

在引用printf之類的東西時,0之後的多餘字符並不重要。就像特拉華州的0之後的額外內存位置在引用它之前不會影響您以前使用的那樣。

+1

對ASCII藝術+1,在這裏得到一個工具.. [asciiflow](http://www.asciiflow.com/#Draw) – 2013-05-11 05:34:08

+0

@HaIR不'strcpy()'獲得騎乘'| S | \ 0 |'在複製了'Delaware'的'De'部分之後的權利?不應該像'strcpy()'一樣使用受到尊重的庫函數清空'| S | 0 |'的內存一旦使用就結束了嗎? – 2013-05-11 15:18:07

+0

不,它不。它對內存沒有任何影響。它是strcpy,不是strcpyandfree或strcpyandclear(據我所知,那些不存在) – HalR 2013-05-11 15:32:52

0

1)這是strcpy()的正確行爲。如果您使用str *值來訪問字符串,您將永遠不會看到任何未更改的字節,因爲字符串終結符('\ 0')被放置在第二個位置(索引0),並且str *函數不會通過字符串的結尾。

2)它不是memcpy()的行爲。如果memcpy(str2, str1, 10),則會複製10個字符。 memcpy(previous, "S", 10)是不是一個好主意,但是;-)

3)如果你想調零的strcpy()之前,以前的[],嘗試像memset(previous, '\0', sizeof(previous))

+0

'memset',而不是'bzero'。後者是一個早在C被標準化之前的過時函數。 – 2013-05-11 03:40:02

+0

是的。我會編輯我的答案。 – 2013-05-11 03:41:29

0

你實現自己的strcpy()功能?如果是這樣,不要忘記將源字符串中的空終止符複製到目標中。空終止符告訴C字符串結束的地方。字符串庫中的默認實現會執行此操作,當您使用printf()將其打印出來時,它將顯示您期望的內容。

如果內存分配是一個問題,那麼你可以free()previous字符串所佔用的空間,然後malloc()足夠讓你複製的字符串,但是這是矯枉過正在大多數情況下,除非你真的擔心內存的限制,其中你可能不會使用字符串庫。

0

的字符串中字符的其餘部分確實應該沒有影響,因爲之前的將具有小號如作爲第一個字符(即,先前[0])和一個NULL值作爲第二。除非你的代碼檢查字符串中的特定字符,否則它應該沒有關係。但是,如果您確實希望字符串具有您複製的值,然後是所有NULL,則可以在執行strcpy之前清除該字符串。

memset(previous, 0, sizeof(previous)); 
strcpy(previous, "S"); 
1

strcpy也將複製了空結束,所以如果你做一個:你的情況

printf("%s\n", previous) ; 

你只會看到S這在大多數情況下是足夠的。如果你真的想你做一個strcpy前零出內存,你總是可以在複製之前使用memset

memset(previous, 0, sizeof(previous)) ; 
相關問題