我第一次练习字符串,我试图从给定的单词中删除连续的重复字母并打印出来。 说这个词是委员会,出局就会很有说服力。
我的逻辑是比较给定单词中的连续字母,如果它们不相同,则将字母存储到另一个字符串中。
当我编译并运行我的代码时,我会得到奇怪的符号。 我的代码中有什么错误?
#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;
}
答案 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++;
}
}