1

Possible Duplicate:
Is it possible to modify a string of char in C?

I have a function to convert a char* to lower case. This is the function:

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]);
    }
}

When I call it like this from main, it throws a segfault error:

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

I'm certain the issue is in the assignment here:

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

But I can't seem to figure out the corect way to do it. I tried passing it as char**, or doing *(word+i), but all cause the same issue.

4

4 に答える 4

6

定数文字列を変更しようとしています"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]);

2つの場合のみ

char needle[] = "foobar";

または、
最初に malloc を使用して char * のメモリを作成し、次のように文字列を割り当てます。

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

これで使えるようになりました

于 2012-07-19T05:27:49.057 に答える