这是一个非常小的问题,可能真的很傻!但是为什么我在输出中为这个函数返回垃圾,这个函数应该删除双字母?
#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 :(得分: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';
答案 1 :(得分:0)
该行
for ( i = 0; i < (c + 1); i++)
应该是
for ( i = 0; i < (c - 1); i++)
然后你需要在strdup
new [i] = 0;
大括号也不会好意思。
修改强>
忘了需要更改以下内容
int i, j=0;
和for循环
new[j++] = toupper(s[i]);
和for循环之后
new[j] = 0;
答案 2 :(得分:0)
这是一个相当紧凑的C99版本的算法(标题省略,example):
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;
}
(这个区别于案件。)