代码:https://pastebin.com/nW6A49ck
/* C program to remove consecutive repeated characters from string. */
#include <stdio.h>
int main() {
char str[100];
int i, j, len, len1;
/* read string */
printf("Enter any string: ");
gets(str);
/* calculating length */
for (len = 0; str[len] != '\0'; len++);
/* assign 0 to len1 - length of removed characters */
len1 = 0;
/* Removing consecutive repeated characters from string */
for (i = 0; i < (len - len1);) {
if (str[i] == str[i + 1]) {
/* shift all characters */
for (j = i; j < (len - len1); j++)
str[j] = str[j + 1];
len1++;
} else {
i++;
}
}
printf("String after removing characters: %s\n", str);
return 0;
}
问题:假设我有字符串“Hello”作为输入。我希望两个 l
都被删除(不仅仅是 1)...“Hello”也是如此(我希望删除 3 个 l
而不仅仅是 2 个 l
)...我该怎么做?
if (str[i] == str[i + 1]) {
/* shift all characters */
for (j = i; j < (len - len1); j++)
str[j] = str[j + 1];
len1++;
}
也许我可以计算每个字符重复的次数,然后在第 28 行将 1 替换为字符重复的次数?但是我如何将其实现到代码中呢?
最佳答案
您可以创建一个函数,通过将字符逐个复制到字符串中的单独指针来删除具有相同字符的范围,如果发现重复字符,则不会前进:
void foo(char *str) {
for(char *wr = str; (*wr = *str) != '\0';) { // copy until `\0` is copied
++str; // step to the next character
if(*wr != *str) { // if the next char is not equal to `*wr`
++wr; // step `wr` forward to save the copied character
} else do {
++str; // `*wr == *str`, so step `str` forward...
} while(*wr == *str); // ...until a different character is found
}
}
*wr = *str
将str
指向的当前字符复制到wr
当前指向的位置。!= '\0'
检查使循环在复制\0
(空终止符)后结束。- 之后
str
增加以指向下一个字符。 - 如果下一个字符与刚刚复制的字符不相等,则增加
wr
以保存复制的字符。 - 如果下一个字符确实等于正在复制的字符,则不要增加
wr
以使其被正在复制的下一个字符覆盖,并向前移动str
直到找到不同的字符。
密集版本做完全相同的事情:
void foo(char *str) {
for(char *wr = str; (*wr = *str) != '\0';) {
if(*wr != *++str) ++wr;
else while(*wr == *++str);
}
}
关于arrays - C程序去除字符串中连续重复的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71807621/