将char *转换为小写会引发段错误

时间:2012-07-19 05:07:38

标签: c pointers char

  

可能重复:
  Is it possible to modify a string of char in C?

我有一个将char *转换为小写的函数。这是功能:

void toLower(char* word, int length)
{
    int i;

    for(i = 0; i < length; i++) {
        // this I can do
        // printf("%c", tolower(word[i]));

        // this throws segfault
        word[i] = tolower(word[i]);
    }
}

当我从main调用它时,它会抛出一个段错误:

char* needle = "foobar";
toLower(needle, strlen(needle));

我确定问题在于此处的任务:

word[i] = tolower(word[i]);

但我似乎无法找到完成它的核心方法。我尝试将其作为char***(word+i)传递,但都会导致同样的问题。

4 个答案:

答案 0 :(得分:6)

您正在尝试更改常量字符串"foobar"。尝试:

char needle[] = "foobar";

这将创建一个包含字符串"foobar"数组(编译器会安排将数据从常量字符串"foobar"复制到您的数组needle可以修改它。)

答案 1 :(得分:1)

您无法修改字符串文字。您可以创建动态字符串:

char *str = strdup(needle);
toLower(str, strlen(str));
/* ... */
free(str);

答案 2 :(得分:0)

问题是char *needle = "foobar"是一个字符串文字 - 它是一个const char。为了使编译器生成可写字符串,请使用

char needle[] = "foobar";

代替。

答案 3 :(得分:0)

无法更改字符串文字。
你可以这样做

 word[i] = tolower(word[i]);

仅在两种情况下,或者

char needle[] = "foobar";


首先使用malloc为char *创建内存,然后为其分配一个字符串,如此

char * str = (char *) malloc(size0f(char)*10);
strcpy(str,"foobar");

现在你可以使用这个