从C中删除字符串中的字符

时间:2016-04-27 18:03:51

标签: c function pointers c-strings

所以我正在做一个关于函数/字符/指针的过去的纸质问题。我在代码中遇到了一个问题,需要帮助理解它。

更具体地说,我遇到问题B)ii)的问题,这要求我从字符串中删除冒号。

我的想法是取字符串,制作指针并直接指向冒号,然后将该冒号替换为继续它的下一个字符。然后用冒号前面的字符替换冒号后的其他字符,直到它达到NULL。

在编译时,它编译得很好,但是给了我分段错误:11。发生了什么?我怎样才能解决这个问题?有什么我不理解的吗?感谢。

Question

#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;
}

2 个答案:

答案 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);

当然,正如评论中指出的那样,这不是代码唯一的错误,但它可能解释了您实际问题的主题分段错误。