我在接受采访时被问到这个问题,但我无法回答。 问题是:通过仅遍历字符串一次从给定字符串中删除特定字符。 例如给定的字符串是:“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];
}
}
}
有了这个逻辑,字符串不止一次遍历,一次在外部循环中,一次在移位操作中。 还有其他办法吗?
答案 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';