繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM