arrays - C程序去除字符串中连续重复的字符

标签 arrays c string c89 string.h

代码: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 = *strstr 指向的当前字符复制到 wr 当前指向的位置。 != '\0' 检查使循环在复制 \0(空终止符)后结束。
  • 之后 str 增加以指向下一个字符。
  • 如果下一个字符与刚刚复制的字符不相等,则增加 wr 以保存复制的字符。
  • 如果下一个字符确实等于正在复制的字符,则不要增加 wr 以使其被正在复制的下一个字符覆盖,并向前移动 str直到找到不同的字符。

Demo

密集版本做完全相同的事情:

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/

相关文章:

C switch case 值不能在 switch 内修改(不是常量)

c - 如何使用CMake计算C项目的构建时间

c++ - Stringstream清零麻烦

python - 对我的数组中的随机数进行排序

javascript - 使用对象数组构建一个对象(与子对象递归)

C指针数组/指针数组消歧

python - 在python中通过其索引和数组切片数据框

c - 如何计算数组中的非零元素?

java - 为什么 StringBuffer 允许 StringBuffer 作为其构造函数的参数,即使 StringBuffer 没有 StringBuffer 构造函数?

java - Android Java 重复字符串 x 次