2010-05-05 82 views
3
char *substring(char *text, int position, int length) 
{ 
    int i, j=0; 
    char *temp ; 

    for(i=position-1; i<position+length-1; i++) 
    { 
    temp[j++] = text[i]; 
    } 
    temp[j] = '\0'; 

    return temp; 
} 

嗨以下代碼中的錯誤是什麼..我試圖在Fedora機器上運行此..它給我一個運行時錯誤「分段故障」。這是什麼錯誤一回事..,爲什麼它給這個錯誤..要查找給定文本中的子字符串.. C程序

謝謝..

+2

當您訪問不應該存在的內存時,通常會出現「分段錯誤」。哎呀。程序中一個非常明顯的缺陷就是'* temp'永遠不會被初始化爲任何東西。 [見Binky指針有趣的視頻!](http://cslibrary.stanford.edu/104/) – 2010-05-05 05:56:57

回答

3

您需要爲temp分配內存 - 目前它的只是一個dangling pointer。您可以使用malloc,但請注意,主叫方需要確保此存儲隨後爲free d。

例如:

char *substring(const char *text, int position, int length) 
{ 
    char *temp = malloc(length + 1); 
    int i, j; 

    for (i = position, j = 0; i < position + length; i++, j++) 
    { 
     temp[j] = text[i]; 
    } 
    temp[j] = '\0'; 

    return temp; 
} 
+0

我怎樣才能釋放內存在這裏,因爲同一指針正在返回到其他功能... – AGeek 2010-05-05 06:11:40

+0

但這裏一必須小心以釋放我們爲temp分配的內存。來電者應該承擔額外的責任。 – dicaprio 2010-05-05 06:39:45

+0

@RBA:理想情況下,調用者應該負責釋放內存。換句話說,你也可以傳遞另一個參數給這個函數,說char * pcSubStr「,它將IN-OUT並返回子串。這樣你就可以在你需要的函數中釋放這個函數。 – dicaprio 2010-05-05 06:59:27

6

temp未初始化。

2

這意味着您的代碼違反了操作系統設置的一些限制,在這種情況下,您正在寫入內存,您無權寫入。

這是因爲您的temp變量只是一個未初始化的指針,它不包含您允許寫入的內存地址。

如果您希望編寫length + 1字符,它必須指向至少多個字節的空間值。

既然你希望返回的字符串,你需要或者使其static(但可能是危險的),或者動態分配空間:

if((temp = malloc(length + 1)) == NULL) 
    return NULL; 
0

而答案是顯而易見的 - 即臨時未初始化, 這裏是一個suggetion。

如果你的目的是要找到一個子在另一個字符串, 幾個備選方案,

1. use C strstr(...) 
2. Robin-Karp method 
3. Knuth-Morris-Pratt method 
4. Boyer Moore method 

Update: Initialy我想這個問題涉及到尋找字符串(基於標題)。無論如何,這看起來像strchr()的實現。

+0

我正在將子字符串拷貝到另一個指針中,這只是尋找給定字符串的一個子字符串的簡單方法.. 希望我是那樣簡單的方式以正確的方式.. 此外,由SysAdmin給出的方法,看起來相當複雜的,但還是比建議..我會嘗試D學習這些以及..但如果你可以告訴我,我是否已經正確實施了非常基本的模式搜索算法,那麼它會非常親切...... 謝謝.. – AGeek 2010-05-05 06:13:02

+1

我認爲OP的意圖不是「find」as在* search *中,而是在* get *或* return *中查找。 「find」這個詞的用法在英語中並不常見,在編程環境中通常不會使用。 – 2010-05-05 06:20:07

0

我提出的子字符串的拷貝到另一個指針,這是剛剛找到一個給定的字符串的一個子的簡單方式..

希望我在正確的方式很簡單的方法..

另外,由SysAdmin給出的方法,看起來相當複雜的,但還是比建議..我會嘗試和學習這些以及..但如果你可以告訴我,我是否已經實施基本模式搜索算法正確,那麼它會很親切..

謝謝..

0

從代碼中可以明顯看出,您錯過了分配/初始化指針* temp的操作。它指向無處。

您必須使用malloc或strdup,然後執行其他操作。但是,你可能還想探索使用strncpy(null terminate)來簡化代碼。

相關問題