2013-09-26 41 views
0

您好,我是C語言新手。基本上我試圖傳遞一個char數組(字符串)的指針到一個函數,並在該函數內我想添加一個字符在該數組的最後。這裏是我試圖運行的代碼。如何在c/C++中作爲參數傳遞的函數內部處理char數組指針(字符串)

所以我說的功能是function1代碼。 指針線是我想要操作的一個。 我想通過使用方法append添加一個字符到函數1內部的行。 我也嘗試了其他幾種方法,但沒有一個真正起作用。

如果有人能告訴我如何正確地做到這一點,這將會非常有幫助。

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

char* function1(char*); 
void append(char* , char); 

int main(int argc, char const *argv[]) 
{ 
    /* code */ 

    function1("each line ends with : "); 
    return 0; 
} 

char* function1(char* line) 
{ 
    int pos = 0; 
    char* longest = ""; 


    printf("so far working!\n"); 
    append(line, '$'); 
    // here during append something happens and all it tells is segmentation fault core dumped 
    printf("not anymore.\n"); 

    return longest; 
} 

void append(char* s, char c) 
{ 
    s[strlen(s)] = c; 
    s[strlen(s)+1] = '\0'; 
} 

回答

2

的問題是,沒有足夠的空間被分配給您的字符串 - 當你聲明的字符串,你說:「這將是不超過n個字節長」(包括結尾'\0')。在不屬於該字符串的內存中寫入字節會導致您看到的錯誤。

當你使用C語言時沒有通用的解決方案 - 在你的例子中,你從一個常量字符串開始(前面定義了"each line ends with: ")並且編譯器只分配那麼多的空間。如果你認爲你可能需要更多的空間,你可以做這樣的事情:

char mySpace[101]; // allocates 101 bytes : 100 characters + terminating '\0' 
strncpy(mySpace, "each line ends with: ", 100);/copy at most 100 bytes 

現在,你可以通過增加一個字符的mySpace長度(不像原來的字符串,因爲這樣你創建這是一個常數

int length; 
length = strlen(mySpace); 
mySpace[length] = '$'; 
mySpace[length+1] = '\0'; 

這是否有意義:它,你可以爲你它分配的內存的限制)內,你想用什麼樣的副本,只要你留下來?

編輯剛剛意識到另一個問題:

中的代碼片段

s[strlen(s)] = c; 
s[strlen(s)+1] = '\0'; 

在您覆蓋字符串的結束'\0'字符的第一行:當你再調用strlen在第二行,該函數會嘗試查找行尾字符(不再存在),並且它會跑到距離中,一直到分段錯誤(這意味着「程序最終嘗試訪問不屬於它」)。當我寫我的代碼片段時,我本能地以正確的方式完成了 - 然後我再次查看了您的代碼,並發現問題盯着我。

+0

非常感謝你,我現在解決了它 – shunya

+0

很高興聽到它。當你第一次開始寫C時,指針和其他東西可能會讓你感到困惑 - 但值得讓你的大腦圍繞它。 – Floris

0

當你在C "like this"中聲明一個字符串時,你實際上沒有得到char*。你得到一個const char*(好吧,不是技術上,但它通常在只讀內存)。切勿嘗試修改在字符串文字中聲明的char*

相關問題