所以我正在做一个关于函数/字符/指针的过去的纸质问题。我在代码中遇到了一个问题,需要帮助理解它。
更具体地说,我遇到问题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;
}
答案 0 :(得分: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);
答案 1 :(得分:0)
在他现在删除的答案中,@ Giorgi指出了你的代码片段,它是有效的C,但却是错误的:
while(y != '\0')
{
printf("%s",y);
y++;
}
变量y
是指向char
的指针,因此while (y != '\0')
相当于while (y != NULL)
,有些人更愿意将其写为while (y)
。 C没有定义任何增加非空指针将产生空指针的方法,所以如果行为不正确,那么这个循环永远不会退出。
然而,实际上,循环体取消引用y
(间接地,通过printf()
)并递增它。在迭代次数过多之前,y
将指向分配给它最初指向(in)的对象的内存之外,之后,取消引用它的行为是未定义的。分段错误是这种特殊UB的常见观察结果。
我怀疑你打算写while(*y != '\0')
,但这似乎仍然很奇怪,因为你最终会打印一串字符串的尾巴,而你似乎只想打印一个字符串。在那种情况下,我不清楚为什么你在这里使用循环。简单的
printf("%s",y);
当然,正如评论中指出的那样,这不是代码唯一的错误,但它可能解释了您实际问题的主题分段错误。