为什么我的tolower调用没有执行?

时间:2014-03-03 01:11:25

标签: c

char * abc = "ABC";

int i;
printf("%s\n", abc);
for (i = 0; i < strlen(abc); i++)
{
    abc[i] = tolower((int) abc[i]);  //Error at this line
}

printf("%s\n", abc);

我调用tolower的行不会执行?

2 个答案:

答案 0 :(得分:5)

char * abc = "ABC";定义字符串文字
在运行期间无法更改 使用char abc[] = "ABC";

编辑:在某些情况下,也许你“可以”改变它,
但是没有任何保证 它可以工作,它可能崩溃,
或者用你的程序做其他奇怪的事情 这些都无法立即识别。

答案 1 :(得分:2)

abc指向一个常量字符串,因为它是只读的,所以不能直接更改该值。有两种方法 (1)您可以在堆栈中分配内存:

char abc[] = "ABC";

int i;
printf("%s\n", abc);
for (i = 0; i < strlen(abc); i++)
{
    abc[i] = tolower((int) abc[i]);  //Error at this line
}

printf("%s\n", abc);  

(2)你也可以在堆中分配内存,代码如下:

int len = strlen("ABC");
char *p = malloc(len + 1);

strcpy(p, "ABC");
printf("%s\n", p);
for (i = 0; i < len; i++)
{
    p[i] = tolower((int) p[i]);  //Error at this line
}

printf("%s\n", p);