【发布时间】:2015-03-17 02:02:48
【问题描述】:
我正在尝试将字符串的字符转换为大写字母
int main (void)
{
int i = 0;
int n = 0;
static char *str[] = { "wow",
"RACEcar",
"No devil lived on.",
"rotor" };
for(i = 0; i < strlen(*str); i++)
{
if(str[i] != NULL)
{
n = function(str[i]);
}
}
return 0;
}
int function(char* x)
{
int i = 0;
int j = strlen(x);
char c;
for(i = 0; i < j; i++)
{
c = toupper(x[i]);
x[i] = c;
}
return 0;
}
我在x[i] = c; 所在的行出现错误提示exc bad access, code 2
我不确定为什么会出现此错误,是否需要创建另一个字符串并将 c 分配给新字符串?
toupper 返回字符的大写版本,但实际上并没有更改元素本身,所以我不确定将 toupper 返回的值分配回元素有什么问题。
【问题讨论】:
-
你是怎么调用那个函数的?你有没有机会做类似
function("string");的事情? -
这与您的问题无关,但
strlen相对昂贵。 C 字符串不存储它们的长度;为了计算x的长度,strlen 需要扫描整个字符串,对字符进行计数,直到达到 NUL。您的for循环强制每个角色 发生这种情况;这是很多扫描。 -
更改为
static const char *str[] = { "wow", ...现在看看为什么它不起作用。您正在尝试更改常量数据。 -
这个循环:
for(i = 0; i < strlen(*str); i++)的执行频率与字符串数组中第一个单词中的字母数相同。"wow"的字母比数组中的字符串少,因此永远不会使用最后一个值。如果“哇”更长,您可能会尝试大写随机内存。 -
请注意,
for循环只会尝试转换 3 个字符串。正如所写,它在第一次崩溃。你真的需要for (i = 0; i < sizeof(str)/sizeof(str[0]); i++)的一些变体来转换所有的字符串。而且你确实需要定义可修改的字符串,比如:char str[][20] = { "...", ... };`.
标签: c string exc-bad-access toupper