2011-11-24 31 views
0

這是一個很小的問題,可能真的很愚蠢!但是,爲什麼我得到垃圾返回我的輸出這個函數應該刪除雙重字母?玩字符串函數

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

char *makehello(char *s) { 
    char new[16] ; 
    int i ; 
    int c = strlen(s); 
    for (i = 0; i < (c + 1); i++) 
    if (toupper(s[i]) != toupper(s[i+1])) 
     new[i] = toupper(s[i]); 
return strdup(new) ; 
} 

int main(void) { 
char *new; 
char data[100]; 
scanf("%s", data); 
new = makehello(data); 
printf("%s", new); 
return 0; 
} 
+0

什麼當有超過16個結果字母時會發生? –

+0

我只是玩atab aacc等測試它,但得到垃圾打印:/ – PnP

+0

請確保您終止結果。初始化爲char char [16] = {0};'。 –

回答

2

您需要爲「新」陣列單獨計數。您將它們存儲在索引'i'(您找到該字符的地方),但您真正想要的是將它們從位置0存儲起來,然後增加此計數。

編輯:當然這不是一個全面的方法。

即是這樣的:

for (i = 0; i < c; i++) 
    { 
     if (toupper(s[i]) != toupper(s[i+1])) 
     { 
      new[count++]= toupper(s[i]); 
     } 
    } 
    new[count] = '\0'; 
+0

而上限應該是'c',或者輸入字符串中的最後一個字符總是被刪除。 –

+0

固定,謝謝:) – DaV

0

for (i = 0; i < (c + 1); i++) 

應該是

for (i = 0; i < (c - 1); i++) 

然後你需要之前strdup新[I] = 0;

大括號不會去amise。

EDIT

忘記需要改變以下

int i, j=0; 

並在for循環

new[j++] = toupper(s[i]); 

和之後的for循環

new[j] = 0; 
+0

我仍然得到垃圾輸出:/ – PnP

+0

即bbb只返回垃圾輸出 – PnP

+0

阿哈,輝煌,現在工作! – PnP

0

這裏的算法(頭略,example)的緊湊合理C99版:(這一個辨別的情況下)

const char * makehello (const char * s) 
{ 
    char new[16] = { *s, 0 }; 
    const char * p = s; 
    char c = *s, * q = new; 

    while (*p) { if (*++p != c) { c = *++q = *p; } } 

    return strdup(new) ; 
} 

int main(void) 
{ 
    char data[100]; 
    scanf("%s", data); 
    printf("%s", makehello(data)); 
    return 0; 
}