1

可能重复:
是否可以在 C 中修改 char 字符串?

我有一个将 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

4 回答 4

6

您正在尝试更改常量 string "foobar"。尝试:

char needle[] = "foobar";

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

于 2012-07-19T05:09:59.487 回答
2

您不能修改字符串文字。您可以创建一个动态字符串:

char *str = strdup(needle);
toLower(str, strlen(str));
/* ... */
free(str);
于 2012-07-19T05:11:21.733 回答
1

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

char needle[] = "foobar";

反而。

于 2012-07-19T05:10:30.193 回答
1

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

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

仅在两种情况下,要么

char needle[] = "foobar";


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

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

现在你可以使用这个

于 2012-07-19T05:27:49.057 回答