关于字符串操作的C段错误

时间:2017-11-17 10:03:24

标签: c string for-loop segmentation-fault

我正在编写一个程序来删除字符串中的单词。在removeWord函数内的for循环中的C段错误(第三个printf永远不会被执行)。原因是什么?我是C中的绝对新手。当我尝试在for循环中打印str [j]为%s时,编译器抱怨str是整数,而不是字符串。那是为什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void removeWord(char * str, char * toRemove)
{
    int i, j, k, stringLen, toRemoveLen;
    stringLen   = strlen(str);      // Length of string
    toRemoveLen = strlen(toRemove); // Length of word to remove
// ...(code for finding the word)...
        printf ("str='%s' StrLen=%d ToRem=%d i=%d j=%d\n",str, stringLen, toRemoveLen, i, j);
        for(j=i; j<=stringLen - toRemoveLen; j++)
        {
            printf ("j=%d\n", j);
            str[j] = str[j + toRemoveLen];
        }
        printf ("i=%d j=%d\n", i, j);
}

int main(void)
{
    char * term = "from the ";
    removeWord(term, "from");
    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是字符串文字。你无法修改它。结果你得到一个试图修改它的段错误。(实际上它是未定义的行为)。

你能做的是

char  term[] = "from the ";

这将帮助您修改它,这就是您想要的。

即使您可以使用char*并在其中分配内存并复制字符串,但这对此任务来说太过分了。

从标准中可以引用§6.4.5

  

未指明这些数组是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。

在你的情况下,temp基本上保存了不可修改的字符串文字的地址。如果你复制它然后可以修改。