我有一个将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)
传递,但都会导致同样的问题。
答案 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");
现在你可以使用这个