2016-08-26 16 views
-1

我有一個問題,我知道下面的實現正常工作:C語言編程,而未通過尺寸參數的函數變化字符串值

void editMessage(char* message , int sizeOfMessage){ 
    char newMessage[] = "modified"; 

    printf("size of message is %lu \n",sizeof(message)); 
    printf("size of new message is %lu \n",sizeof(newMessage)); 

    if (sizeof(newMessage) <= sizeOfMessage) { 

     for (int i=0 ; i < sizeof(newMessage); i++) { 

      message[i] = newMessage[i]; 

     } 

    } else { 
     printf("size of new message is too big\n"); 
    } 

} 

int main() { 

    char randMessage[] = "original message"; 
    editMessage(randMessage,sizeof(randMessage)); 
    printf("the value of randMessage after function call is %s \n",randMessage); 
    return 0; 
} 

,但如果我想改變函數的字符串值,而不及格指針的大小,可能嗎?如果是的話,怎麼樣?如果沒有,爲什麼不呢?

我的意思是我期待改變上述editMessage功能是這樣的:

void editMessage(char* message){ 
    char newMessage[] = "modified"; 

    printf("size of message is %lu \n",sizeof(message)); 
    printf("size of new message is %lu \n",sizeof(newMessage)); 

    if (sizeof(newMessage) <= sizeOf(message)) { 

     for (int i=0 ; i < sizeOf(message); i++) { 

      message[i] = newMessage[i]; 

     } 

    } else { 
     printf("size of new message is too big\n"); 
    } 

} 

像這樣

editMessage(randMessage); 

這是爲什麼不工作在主通話,可以一個請解釋詳情,然後我會接受他的迴應? 謝謝!

+5

'sizeof(message)'是*指針*的大小,而不是它指向的對象的大小。 – EOF

+1

使用'strlen'來獲取字符串的* length *。 –

+1

@ user3001566至少你顯示的第一個函數是不正確的,沒有任何意義。:) –

回答

3

sizeOf(message)不起作用。 sizeOf(message)將給出變量message的大小,並且由於原來message是一個指針,您將獲得指針的大小。


既然是NUL結尾的字符串,您可以通過使用strlen()得到字符串的長度和使用,在你的函數。


所以,你的代碼應該是這個樣子,

void editMessage(char* message){ 
    char newMessage[] = "modified"; 
    int size = strlen(message); 

    printf("size of message is %d \n", size); 
    printf("size of new message is %lu \n",sizeof(newMessage)); 

    if (sizeof(newMessage) <= size) { 

     for (int i=0 ; i < size; i++) { 

      message[i] = newMessage[i]; 

     } 

    } else { 
     printf("size of new message is too big\n"); 
    } 

} 

對於char數組,它不是由NUL終止,沒有辦法找出其他的長度,然後作爲參數發送char的數組長度。

因此,在調用函數中,您需要跟蹤您在數組中寫入的數量(知道長度)。

通知我不是說因爲char陣列成爲只有當它是由NUL字符終止。


注:

使用標準定義的main()

int main(void) //if no command line arguments. 
+0

如果charachter數組不會終止null?那麼如果我不能使用strlen,解決方案是什麼?如果你能解釋這種情況並將其添加到你的答案,那麼我會接受你的帖子作爲這個線程的答案,謝謝 – Jack

+0

@ user3001566,你去.. :) – Haris

+0

非常感謝! – Jack

1

在C,

void func(char message[])變得void func(char *message)。所以,當你在被調用函數中做sizeof(message)時,它只會返回指針的大小。在「C」數組中不傳值。

如果您確定,您的字符數組將始終爲空終止,您使用strlen來獲取它的長度。

+0

如果charachter數組不會以null結束?那麼如果我不能使用strlen,解決方案是什麼?謝謝 – Jack

0

使用strlen來獲取輸入字符串的長度。

BTW:請注意你的這部分代碼:

if (sizeof(newMessage) <= sizeOfMessage) { 

    for (int i=0 ; i < sizeOfMessage; i++) { 

     message[i] = newMessage[i]; 

如果sizeof(newMessage)是9和sizeOfMessage是100,你會進入到newMessage[9]newMessage[99]是陣列外部。

2

如果我想改變函數中的字符串值而不傳遞指針的大小,有可能嗎?如果是的話,怎麼樣?如果沒有,爲什麼不呢?

您可以通過strlen()函數確定輸入消息的長度。假設您規定該函數只適用於正確的以空字符結尾的字符串,那麼假設包含該字符串的數組足夠長以容納該字符串(包括終止符)是合理的。因此,在某種程度上,您可以用​​代替原來的sizeOfMessage

然而,即更限制性比原來的功能,因爲包含字符串數組可以比串需要較大。如果您使用輸入字符串的長度來限制替換字符串的長度,那麼您絕對不能使用任何此類多餘的容量。考慮:

int main() { 
    char randMessage[1024] = ""; 
    /* 
     * sizeof(randMessage) is 1024, but strlen(randMessage) is 0. Which do 
     * you prefer as the limit on the size of the message that editMessage() 
     * can insert? 
     */ 
    editMessage(randMessage, sizeof(randMessage)); 
    return 0; 
}