2011-10-02 55 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是使用之后被递增。