我有这段代码:
void changeToCapital(char* str)
{
int i;
for (i=0; i<strlen(str); i++)
{
str[i] =str[i] -32;
}
}
并且此方法应该获取char*
变量,并将其更改为大写。出于某种原因,我收到错误EXECUTE_BAD_ACCESS
。
调用函数:
char* s = "itzik";
changeToCapital(s);
printf("%s\n",s);
我在这里做错了什么?
答案 0 :(得分:12)
这很可能是因为您向它传递了一个指向不可写内存的指针,例如从字符串文字中获取的内存:
char *ptr = "Hello";
changeToCapital(ptr); // <<== ERROR !
您可以更改通话以避免错误:
char ptr[] = "Hello";
changeToCapital(ptr);
在旁注中,只有当所有字母都是小写字母时,您对大写字母的更改才有效。您应该使用toupper(ch)
函数而不是减去32。
void changeToCapital(char* str) {
for (; *str = toupper(*str) ; str++)
;
}
答案 1 :(得分:4)
首先:
您一直在计算strlen
。相反,您应该将字符串的长度存储在局部变量中。
第二:你可能正在调用这样的函数:
char *str = "Hello World";
changeToCapital(str);
BAD 。 "Hello World"
为const
,您的计划无法修改。相反,您应该将字符串指定为字符数组,以确保它是不可变的:
char str[] = "Hello World";
changeToCapital(str);