[英]Removing a character from a string in C
所以我正在做一个关于函数/字符/指针的纸质问题。 我在代码中遇到问题,需要帮助来理解它。
更具体地说,我在问题B)ii)中遇到问题,这要求我从字符串中删除冒号。
我的想法是取字符串,做一个指针并直接指向冒号,然后用继续它的下一个字符替换此冒号。 然后用冒号前面的字符替换冒号后面的其他字符,直到达到NULL。
在编译时,它可以编译,但是给我分段错误:11。这是怎么回事? 我怎样才能解决这个问题? 有我不明白的东西吗? 谢谢。
#include <stdio.h>
#include <stdlib.h>
int locate_colon(char* x) //Question B) i)
{
int i = 0;
while(*x != '\0')
{
if(*x == ':')
{
return i;
}
i++;
x++;
}
return -1;
}
char* remove_colon(char* x) //Question B) ii)
{
int y,i,j;
y = locate_colon(x);
i =0;
j =1;
while(*x != '\0')
{
x[y+i] = x[y+j];
i++;
j++;
}
return x;
}
int main() //Testing if functions work by running through compiler
{
int x;
char colon[] = "Colon: 123";
char* colonptr;
colonptr = colon;
x = locate_colon(colonptr);
printf("%d",x);
//B) ii)
char* y;
y = remove_colon(colonptr);
while(y != '\0')
{
printf("%s",y);
y++;
}
return 0;
}
您在remove_colon()
循环应为:
while(x[y+i] != '\0')
{
x[y+i] = x[y+j];
i++;
j++;
}
x[y+i]= '\0';
和
while(y != '\0')
{
printf("%s",y);
y++;
}
应该只是:
printf("%s",y);
或其他选择:
printf("%s",colonptr);
@Giorgi在他现在删除的答案中指出了您的代码片段,该片段是有效的C语言,但还是很错误的:
while(y != '\0')
{
printf("%s",y);
y++;
}
变量y
是指向char
的指针,因此while (y != '\\0')
等效于while (y != NULL)
,有些人希望将其写为while (y)
。 C没有定义增加非null指针将产生null指针的任何方式,因此,如果以其他方式定义了良好的行为,则此循环将永远不会退出。
但是,实际上,循环的主体取消了y
的引用(间接通过printf()
)并对其进行递增。 在进行太多迭代之前, y
会指向分配给它最初指向的对象的内存之外,此后,解引用该对象的行为是不确定的。 分割错误是这种特定类型的UB的常见观察结果。
我怀疑您打算写while(*y != '\\0')
,但这仍然很奇怪,因为您最终将打印出字符串的尾部序列,而似乎只想打印一个字符串。 在那种情况下,我不清楚您为什么在这里使用循环。 简单有什么问题
printf("%s",y);
?
当然,正如注释中指出的那样,这并不是代码唯一的问题,但它可能解释了作为实际问题主题的分段错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.