2014-10-19 28 views
0

免責聲明:以下代碼取自Derek Banas的YouTube,我只是不明白它爲什麼起作用。通過C中的函數更改字符串

在下面的代碼中,即使字符串的大小不一樣,整個字符串也會被更改。但我不明白整個字符串在for循環沒有經過所有索引時如何改變。例如,如果oldString的長度是10,newString的大小是5,那麼下面的for循環會改變oldString上的索引0到4(據我所知),但是其餘的字符串被刪除了,而我是不知道如何。我自己測試了代碼,它確實有效。

#include <string.h> 
#include <stdio.h> 
void editMessageSent(char* message, int size){ 
    char newMessage[] = "New Message"; 
    if(size > sizeof(newMessage)){ 
     for(int i = 0; i < sizeof(newMessage); i++){ 
      message[i] = newMessage[i]; 
     } 
    } else { 
     printf("New Message is too big\n\n"); 
    } 
} 
void main(){ 
    // Passing a String to a Function ---- 
    char randomMessage[] = "Edit my function"; 
    printf("Old Message: %s \n\n", 
     randomMessage); 
    editMessageSent(randomMessage, 
     sizeof(randomMessage)); 
    printf("New Message: %s \n\n", 
     randomMessage); 
    } 
+0

'newMessage'包含隱含的'\ 0'來終止字符串常量。檢查'sizeof(newMessage)'的結果(或者通過調試器中的循環)。 – 2014-10-19 03:02:00

回答

2

如果新字符串較短,則也會將空終止符'\0'複製到舊字符串中。

editMessageSent並且之後,例如,如果新的字符串是"hello"

"Edit my function" -> "hello\0y function" 

"%s"printf輸出串,直到第一'\0'

+0

謝謝。所以字符串的大小保持不變,會不會有一種方法來真正改變大小,所以它不使用額外的空間? (儘可能小)。或者你真的不得不爲此創建一個新的字符串? – user120920 2014-10-19 03:16:45

+1

'randomMessage'是一個數組,它的大小是不變的。 – 2014-10-19 03:18:55

+1

@ user120920如果字符串是從malloc中獲得的,則可以使用realloc來返回額外的空間。但是在這段代碼中,它的編譯時分配了17個字符(sizeof(「Edit my function」)== 17)的數組,並且不能更改。 – 2014-10-19 03:49:51

相關問題