C语言中的大写字母

我有这样的代码:

void changeToCapital(char* str)
{
    int i;
    for (i=0; i

并且该方法应该获得一个 char * 变量,并将其更改为大写。出于某种原因,我收到一条错误消息,说 EXECUTE_BAD_ACCESS

调用函数:

char* s = "itzik";
changeToCapital(s);
printf("%s\n",s);

我在这里做错了什么?

1
额外 编辑
意见: 1
尽管你的函数需要一个 char * 。你需要传递它&str [i]
额外 作者 Mike Kwan,
@ H2CO3:我只是基于他说他正在传递 str [i] 。该代码仅在之后添加。
额外 作者 Mike Kwan,
即时通讯做str [i],是不是一个字符?
额外 作者 Itzik984,
额外 作者 Bo Persson,
听起来像指针问题 - 当它崩溃时, str 指向的字符串是什么?
额外 作者 wkl,
你想修改一个字符串文字吗?
额外 作者 Tim Cooper,
显示呼叫功能。
额外 作者 Benjamin Lindley,

2 答案

这很可能是因为你正在向它传递一个指向非可写内存的指针,例如从字符串文字中获得的指针:

char *ptr = "Hello";
changeToCapital(ptr);//<<== ERROR !

您可以更改呼叫以避免该错误:

char ptr[] = "Hello";
changeToCapital(ptr);

在附注中,只有在所有字母都是小写的情况下,您对大写字母的改变才起作用。你应该使用 toupper(ch)函数,而不是减去32。

void changeToCapital(char* str) {
    for (; *str = toupper(*str) ; str++)
        ;
}
12
额外
@RobertCooper我认为不适用于土耳其语(还有很多其他语言)仍然比不工作,即使英文:)
额外 作者 dasblinkenlight,
@罗伯特库珀 - 谁给了土耳其人一个呐喊!
额外 作者 DumbCoder,
toupper(ch)仍然不适用于土耳其
额外 作者 Robert Cooper,

第一:

你正在不断计算 strlen 。相反,您应该将字符串的长度存储在局部变量中。

第二:你可能调用了这样的函数:

char *str = "Hello World";
changeToCapital(str);

这是不良“Hello World”const ,并且不能被程序修改。相反,您应该将您的字符串指定为字符数组,以确保它是不可变的:

char str[] = "Hello World";
changeToCapital(str);
4
额外
strlen(str)的值在他的代码中不是常量。当 str [i] ==''时,考虑 str [i] = str [i] -32; 的影响。
额外 作者 Robᵩ,
@ H2CO3 - 毫无疑问,OP的程序在许多层面上都是错误的。我只是在观察理查德的优化不会产生相同的结果。
额外 作者 Robᵩ,