1

我正在尝试将字符串的字符转换为大写字母

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;
}

exc bad access, code 2x[i] = c; 不确定为什么会收到此错误的行出现错误提示,是否需要创建另一个字符串并将 c 分配给新字符串?toupper 返回字符的大写版本,但实际上并没有更改元素本身,所以我不确定将 toupper 返回的值分配回元素有什么问题。

4

1 回答 1

2

您的代码尝试修改字符串文字,这会导致未定义的行为。

该字符串"No devil lived on."不可修改的。为了帮助编译器捕获错误,您应该将数组声明为:

static char const *str[] = { "wow", // etc.

由于历史原因,如果您忘记包含const. 但这仍然是一个错误,一些编译器无论如何都会发出警告。

对于 gcc,您可以使用该标志-Wwrite-strings来禁用对历史案例的支持;这将导致按原样为您的代码生成错误消息。

于 2015-03-17T02:48:27.833 回答