我正在尝试从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的初学者。 感谢
答案 0 :(得分:24)
你可以这样做:
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
用于写入),总是提前读取指针,并且只有当它没有指向一个指针时才推进写入指针给定的角色。
答案 1 :(得分:4)
如果你删除了那些字符,那么每次删除一个字符时,你必须将字符串的其余部分移到左边一个位置,这不是很有效。最好的方法是使用第二个数组来获取过滤后的字符串。例如,您可以像这样更改代码。
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);
答案 2 :(得分:2)
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';
答案 3 :(得分:1)
问题是当你遇到匹配c
的第一个字符时,你会在那里插入一个空字符。这意味着你基本上切断了其余的字符串。
您需要做的是找到匹配的字符,将后面的字符移回一个位置。然后,您需要在最后插入空字符,具体取决于您删除的字符数。
答案 4 :(得分:1)
我知道这是一种重复的答案,但这段代码是用于解决问题的函数版本。我认为,由于提问者是初学者,他可能会从分解版本的问题中学到很多东西。
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;
}
答案 5 :(得分:0)
只需更改
if (*ptr1 == c) *ptr1 = 0;
到
if (*ptr1 == c) continue;
正如@ouah所说,它在第一个NULL字符处断开..
答案 6 :(得分:-1)
C将字符串定义为“由第一个空字符