2016-09-19 85 views
1

我對C非常陌生,我應該創建strtok函數。問題是,我不斷收到分段錯誤在此代碼:通過字符串迭代C中的分段錯誤

char *newstring = "testing, testing, tested." 
while(*newstring != '\0'){ 
    /*replace delimiters with nulls*/ 
    printf("STARTING ITERATION\n"); 
    if(*newstring ==','){ 
     *newstring='\0'; 
    } 

    printf("newstring char in loop: %c\n", *newstring); 
    /*printf("delimiters char in loop: %c\n", *delimiters);*/ 
    newstring++; 
    printf("END OF ITERATION\n"); 
} 
printf("OUT OF ITERATION"); 

輸出是這樣的:

STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: e 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: s 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: e 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: s 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: e 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: s 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: . 
END OF ITERATION 
Segmentation fault (core dumped) 

所以,它看起來像它會一路走過來的字符串的結束和循環的最後一步,但實際上並沒有使它退出循環。我不知道我錯過了什麼。

+2

你正在修改字符串字面..這是未定義的行爲。試試'char newstring [] =「測試,測試,測試。」;'而是。 – yano

+0

指針不是數組。您的代碼調用未定義的行爲。您嘗試修改_string literal_。 – Olaf

+0

你知道Literal String是什麼嗎? – Michi

回答

3

您正在嘗試修改C中不允許的字符串文字。如果將char *newstring = "testing, testing, tested."更改爲char newstring[] = "testing, testing, tested.",那麼您正在修改數組的內容。

+1

在C++它不會編譯。 – Olaf

+0

事情是,對於這個代碼片段存在的函數,輸入字符串作爲字符串文字參數進來。所以我需要找到一種方法將文字複製到一個數組中,並且我不允許使用字符串庫函數。 我很樂意接受這方面的建議。 – ChasetopherB

+0

@ChasetopherB遍歷字符串以獲得它的長度。分配內存'char * modStr = malloc(strLen + 1)'。並用'memcpy'複製字符串內容。 – Nikita