2011-10-02 66 views
-1

我試圖寫一個快速的函數刪除刪除特定字符下劃線試圖從一個字符串

char yytext[25] = {"IDEN_T3FY_ER"}; 
char removeUnderscore[9]; 
int i, j = 0; 

printf("Before: %s\n", yytext); 


for (i = 0; i < strlen(yytext); i++){ 
    if (j == 8) 
     break; 
    if (yytext[i] != '_') 
     removeUnderscore[j++] = yytext[i]; 
} 

removeUnderscore[++j] = '\0'; 

printf("\nAfter: %s", removeUnderscore); 

但是打印時,它會得到前8個字符正確,並附加垃圾「8時'的值,而不是換行符。

任何人都可以解釋爲什麼嗎?或者也許提供一個更簡單的方法來這樣做?

+0

爲什麼你有8和9硬編碼到你的代碼而不是'#define BUFSIZE 8'和'char removeUnderscore [BUFSIZE + 1];'?另外,爲什麼你使用'char yytext [25] = {「string」};'?大括號是不必要的,除非您在代碼中的其他地方有理由,否則25也是不必要的(如果您的字符串變爲超過25個字符,則可能有害)。 –

回答

2

在寫入空字符來終止字符串之前,您正在遞增您的索引變量j。試試:

removeUnderscore[j] = '\0'; 

改爲。

你也說最後應該有一個換行符,但是你從來沒有寫過換行符到輸出字符串。

+0

啊,你是對的。我是個白癡。 –

0

其超越了removeUnderscore的大小。最後一行實際上設置9,而不是索引8.

0
removeUnderscore[j++] = yytext[i]; 
... 
removeUnderscore[++j] = '\0'; 

++j j被使用之前遞增,並且在j++ j是使用之後被遞增。