删除给定单词中的重复字母

时间:2016-04-14 08:02:13

标签: c string

我第一次练习字符串,我试图从给定的单词中删除连续的重复字母并打印出来。 说这个词是委员会,出局就会很有说服力。

我的逻辑是比较给定单词中的连续字母,如果它们不相同,则将字母存储到另一个字符串中。

当我编译并运行我的代码时,我会得到奇怪的符号。 我的代码中有什么错误?

#include<stdio.h>
#include<string.h>
int main()
{
    char word[20],modword[20];
    int i=0,j=0;
    gets(word);
    for (i=0;i<20;i++)
    {
        if (word[i]!=word[i++])
        {
        modword[j]=word[i];
        j++;
        }

    }
    puts(modword);
    return 0;
}

2 个答案:

答案 0 :(得分:3)

  • word[i]!=word[i++]调用未定义的行为。直观地解释为,因为未指定word[i]word[i++]是否将首先评估,评估顺序将更改将访问哪个元素。
  • 避免使用具有自动存储持续时间的未初始化变量的值,这是不确定的,或者您将调用未定义的行为

试试这个:

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

#define MAX_LENGTH 20

int main(void)
{
    char word[MAX_LENGTH + 1],modword[MAX_LENGTH], *lf;
    int i=0,j=0;
    fgets(word, sizeof(word), stdin);
    if ((lf = strchr(word, '\n')) != NULL) *lf = '\0';
    for (i=0;i<MAX_LENGTH;i++)
    {
        if (i == 0 || word[i-1]!=word[i])
        {
            modword[j]=word[i];
            if (word[i] == '\0') break;
            j++;
        }

    }
    puts(modword);
    return 0;
}

点数:

  • 避免使用gets()来避免缓冲区溢出。
  • 使用魔术数字并不是一个好主意。
  • 循环中没有i的增量。由于短路评估,word[i-1]不会评估i == 0
  • 到达终止空字符时停止循环。

答案 1 :(得分:0)

您需要应用某些更改,例如

char word[20] = {0};
char modword[20] = {0};
int i = 0, j = 0;

fgets(name, sizeof(word), stdin);

for (i=0; i < sizeof(word) - 1;i++)
{
    if (word[i] != word[i+1])
    {
        modword[j] = word[i];
        j++;
    }

}