通过仅遍历字符串一次从字符串中删除特定字符

时间:2017-10-29 19:49:42

标签: c string

我在接受采访时被问到这个问题,但我无法回答。 问题是:通过仅遍历字符串一次从给定字符串中删除特定字符。 例如给定的字符串是:“aaabbcdabe”      删除所有'b'      输出:“”aaacdae“

我做了这个逻辑,但它不止一次遍历字符串:

for(int i=0; str[i]!='\0'; i++)
{
    if(str[i] == 'b')
    {
      for(j=i; str[j]!='\0'; j++)
      {
        str[j] = str[j+1];
      }
    }
}

有了这个逻辑,字符串不止一次遍历,一次在外部循环中,一次在移位操作中。 还有其他办法吗?

2 个答案:

答案 0 :(得分:5)

保持指向读取位置的指针和指向写入位置的指针。每次读指针前进时,只有在没有删除字符时才通过写指针写入。只有在写入字符时才推进写指针:

#include <stdio.h>

void remove_chars(char *str, const char c);

int main(void)
{
    char test_str[] = "aaabbcdabe";

    puts(test_str);
    remove_chars(test_str, 'b');

    puts(test_str);

    return 0;
}

void remove_chars(char *str, const char c)
{
    char *write_ptr = str;

    while (*str) {
        if (*str != c) {
            *write_ptr = *str;
            ++write_ptr;
        }
        ++str;
    }
    *write_ptr = '\0';
}

节目输出:

λ> ./a.out
aaabbcdabe
aaacdae

答案 1 :(得分:3)

这应该有效。它很短而且很甜蜜。

int newLen = 0;
int oldLen = strlen(str);
for(int i=0; i<oldLen; i++){
    if(str[i] != 'b'){
        str[newLen] = str[i];
        newLen++;
    }
}
str[newLen] = '\0';