【问题标题】:Removing a subtring from beginning of a string in C从C中的字符串开头删除子字符串
【发布时间】:2015-02-03 19:54:57
【问题描述】:

我在删除位于另一个开头的子字符串时遇到问题。我尝试了 2 或 3 个不同的选项,但是当我打印修改后的字符串时,它们似乎都没有工作。你能告诉我我做错了什么或告诉我其他删除子字符串的方法吗?

这是我使用的代码:

    int i;char *c,*p;
    c= malloc(200*sizeof(char));
    fgets(c,200,stdin);
    p=malloc(200*sizeof(char));;
    fgets(p,200,stdin);
    if (strstr(c,p) != NULL)
    { 
            if ((strlen(c)-strlen(p))>2)
            {
                  c= c+strlen(p);
                 //memmove(c,c+strlen(p),strlen(c)-strlen(p)+1);
            }
    }
    printf("%s \n",c);

【问题讨论】:

  • 请用语言标签(c 和/或 c++)标记问题
  • 你应该解释得更仔细。我认为您正在尝试删除在p 中输入的字符串,如果它出现在c 中输入的字符串的开头。如果是这样,你需要从c中删除换行符,你需要一个锚定比较(可能是strncmp())进行相等,然后将p中出现在c匹配之后的部分复制到开头p(所以memmove() 是正确的,而memcpy() 通常是不正确的——更准确地说,它是不正确的,除非p 的长度小于c 的两倍)。
  • 感谢您的帮助!
  • 我发现了问题,事实上我正在使用 strstr

标签: c string character substring dynamic-memory-allocation


【解决方案1】:

您必须存储/记住 strstr() 调用的结果,它是字符串中子字符串所在的位置

据我所知,您对 strlen 的操作是无用的,并且分配给 c 是错误的,因为您丢失了指向堆字符串的指针,这肯定是内存泄漏

更新

类似

char* r = NULL; // result to be stored here
char* q = strstr(c, p);
if (q != NULL)
{
    r = malloc(200);
    strcpy(r, q);
}
if (r)
    printf("%s \n", r);

// cleanup
if (r)
    free(r);
free(c);
free(p);

【讨论】:

    猜你喜欢
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多