2012-03-26 61 views
1

我試圖寫一個函數來修改字符串C. 如果我有一個像尖和串用C

char *func(char *s){ 
    char *t=s; 
    s++;  //option 1 
    t++;  //option 2 
    *t='a'; //option 2 
    return s; 
} 

的功能。如果我這樣做[選項1]:s++;我相信它將指針返回到現在指向的任何位置。如果我做[選項2]:t++;*t='a';然後return s,它會返回s的第一個地點的地址,但帶有修改的內容,還是會返回帶有原始內容的地址?

+7

讀一本書。有很多關於C如何工作的書籍。 – 2012-03-26 20:34:08

+0

你的函數目前不返回任何東西,所以你的問題不清楚。 – 2012-03-26 20:36:51

+0

書。原來的互聯網。 – 2012-03-26 20:38:52

回答

2

如果我做t ++;和* t ='a';然後返回s,它是否會返回地址 s的第一個地方,但修改了內容,還是會返回 地址與原始內容?

我相信你的問題是假設是這樣的:

char s[] = "abcde"; 
char *t = s; 
t++; 
*t = 'a'; 

在這裏,您已經有了一個字符串,兩個指針最初都指向字符串的開頭。在第三行,您修改其中一個指針指向下一個字符。在第四行,您可以修改該位置的數據。由於s指向相同的數據,並且數據被修改,所指向的字符串將會改變。

printf("s is: %s\n", s"); // s is: aacde 
printf("t is: %s\n", t"); // t is: acde 

順便說一句,有沒有真正瞭解這種東西比寫小測試程序和他們一起玩更好的辦法。一本好書可以解釋事情本該如何工作,但是使用代碼是你成長爲真正理解代碼並相信書籍告訴你的方式。

+1

你不需要'char s [] =「abcde」'能夠修改它嗎? – steabert 2012-03-26 20:46:50

+0

@steabert是的,你當然可以。感謝您的支持。 – Caleb 2012-03-26 20:57:55

4
char *func(char *s) 

在此代碼,s是指向的存儲器的區域,即(我假設)表示的字符串。

s++; 

現在s指向下一個字符,在存儲器的相同區域,即(我假設)表示的字符串。

char *t=s; 

現在你有指向的內存區域。

t++; 
*t='a'; 

現在已經更改的內存區域,與'a'更換第二個字符。

因此:如果您然後返回s,您將返回一個指向同一個內存區域的指針,該指針已被更改。如果您想要返回字符串的更改副本,則必須首先創建一個內存副本。

char *func(char *s){ 
    char *t=strdup(s); //duplicates a string 
    s++; 
    *t='a'; 
    free(t); //you have to free the memory from strdup at some point 
    return s; //returns pointer to second character of unchanged string 
} 
+0

Aa你增加了指針't','free'位是未定義的。 – 2012-03-26 22:16:22

+0

@EdHeal:謝謝,我也有一個錯誤的評論。 – 2012-03-26 23:12:50

0

在代碼:

char *func(char *s) 
{ 
    char *t=s; 
} 

你缺少return語句,所以垃圾被返回。

變量s是您傳遞給函數的任何本地副本。如果在函數內寫入s++,則可以更改本地指針指向的內容,但不要更改該參數。

當你做t++;*t = 'a';,你正在t點爲s傳遞的字符串的第二個字符,然後分配角色'a'了這一點。

所以,如果您有:

char *func(char *s) 
{ 
    char *t = s; 
    s++; 
    t++; 
    *t = 'a'; 
    return s; 
} 

則返回值將是一個指向原始的字符串,這已被修改爲包含'a'的第二個字符。

+0

我認爲你需要一個雙指針指向一個指針。這不是說int a = b,如果我改變a,b會改變嗎? – chikuba 2012-03-26 20:45:23

+1

@chikuba:我不完全確定你在問什麼。是的,你需要一個雙指針指向一個指針。但是參數列表中的's'只是指針的副本,而不是指向指針的指針。同樣,'t'是一個簡單的指針。但'* t'分配給由's'指向的字符串的一部分。寫'* t ='a';'修改字符串,但不是指向字符串的指針。特別是,如果調用是'func(&array [4])',那麼'* t'賦值會在調用函數中修改'array [5]',而不會改變'&array [4]'以及因爲這是不可修改的)。 – 2012-03-26 20:49:01

+0

是的。不知道我說什麼*有更多的咖啡* – chikuba 2012-03-26 20:51:08

0

你需要什麼行爲?

既返回s的初始值,又返回s的最終值是有意義的。

你沒有的一個選項是做*t='a',但返回原始內存不變。內存改變

返回原來的s很常見,例如strcpy。

返回一個指向'剛剛修改過的下一個字符'(這是你沒有提供的選項)的指針也很常見。

您需要仔細考慮,並決定該功能有什麼用處?