2011-11-24 26 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; 
}