![](/img/trans.png)
[英][Code Walkthrough]How to remove all occurrences of a given character from string in C?
[英]How to remove all occurrences of a given character from string in C?
我正在尝试从C语言的字符串中删除字符。我的代码存在的问题是,它从字符串中删除了该字符的第一个实例,但也擦除了字符串中该字符之后的所有内容。 例如,从“ hello”中删除“ l”将打印“ he”而不是“ heo”
int i;
char str1[30] = "Hello", *ptr1, c = 'l';
ptr1 = str1;
for (i=0; i<strlen(str1); i++)
{
if (*ptr1 == c) *ptr1 = 0;
printf("%c\n", *ptr1);
ptr1++;
}
我需要为此使用指针,并且由于我是C语言的初学者,因此希望使其尽可能简单。
您可以这样做:
void remove_all_chars(char* str, char c) {
char *pr = str, *pw = str;
while (*pr) {
*pw = *pr++;
pw += (*pw != c);
}
*pw = '\0';
}
int main() {
char str[] = "llHello, world!ll";
remove_all_chars(str, 'l');
printf("'%s'\n", str);
return 0;
}
这个想法是保持一个单独的读写指针( pr
用于读取, pw
用于写入),始终提前读取指针,并且仅在未指向给定字符时才提前写入指针。
如果在适当位置删除字符,则每次删除字符时都必须将字符串的其余部分向左移动一个位置,这不是很有效。 最好的方法是让第二个数组接受已过滤的字符串。 例如,您可以像这样更改代码。
int i;
char str1[30] = "Hello", *ptr1, c = 'l';
char str2[30] = {0}, *ptr2;
ptr1 = str1;
ptr2 = str2;
for (i=0; i<strlen(str1); i++)
{
if (*ptr1 != c) *ptr2++=*ptr1;
ptr1++;
}
printf("%s\n", str2);
char str1[30] = "Hello", *prt1, c = 'l';
char str2[30], *prt2;
prt1 = str1;
prt2 = str2;
while(*prt1 != 0)
{
if(*prt1 != c)
{
*prt2 = *prt1;
prt2++;
}
prt1++;
}
*prt2 = '\0';
我知道这是重复答案的一种,但是此代码是用于解决问题的函数版本。 我以为提问者是个初学者,他可能会从问题的分解版本中学到很多东西。
int del_x_char(char *p, int x)
{
char *q;
x=first_occurance(p, 'i')/*you can replace any character that you want delete with 'i'*/
q=p+x;
while(*q=*(q+1))
q++;
*q='\0';
return 0;
}
int first_occurance(char *q, char phar)
{
int i=0;
while(*q)
{
if(*q++==phar)
return i;
i++;
}
return -1;
}
问题是,当您遇到与c
匹配的第一个字符时,您会在此插入一个空字符。 这意味着您实际上要切断字符串的其余部分。
您需要做的是找到匹配的字符时,将以下字符移回一个位置。 然后,您需要根据删除的字符数在最后插入空字符。
只是改变
if (*ptr1 == c) *ptr1 = 0;
至
if (*ptr1 == c) continue;
如@ouah所说,它在第一个NULL字符处中断。
C将字符串定义为“由第一个空字符终止并包括第一个空字符的连续字符序列”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.