【问题标题】:I receive an error when trying to manipulate elements of a char array within a user defined function尝试在用户定义的函数中操作 char 数组的元素时收到错误消息
【发布时间】:2020-04-27 20:03:52
【问题描述】:

我一直在尝试操作字符串“Hello World!”的元素。在主函数中找到。我的目标是将“Hello World!”的小写字母大写。在“大写”函数内部,但它不允许我。我尝试在不操作任何元素的情况下返回字符串,它工作正常,但是一旦我包含将小写字符转换为大写字符的代码部分,就会出现运行时错误,提示“线程 1:EXC_BAD_ACCESS (code=2, address=0x100000fa9). 什么不允许我操作字符数组,我应该怎么做才能解决它?

char *capitalize(char *str)
{
    int i;

    for(i = 0; i < 4; i++)
        if(str[i] >= 'a' && str[i] <= 'z')
            str[i] -= 32; //I receive an error hear saying 
                          //Thread 1: EXC_BAD_ACCESS (code=2, address=0x100000fa9)

    return str;
}

int main()
{
    char string[40];

    printf("\n%s\n", strcpy(string, capitalize("abcd")));

    return 0;
}

作为参考,我在教科书中包含了具体问题:

问题 3.4。实现 char *Capitalize(char *str);它将大写字符串中的所有小写字母。这些函数将指针返回到修改后的字符串的第一个字节。例如,函数调用 strcpy(string, Capitalize("Hello World!"));将复制“HELLO WORLD!”作为变量字符串的值。

【问题讨论】:

  • 字符串abcd分配在内存的只读部分。你不能修改它们

标签: c arrays pointers char c-strings


【解决方案1】:

问题在于capitalize("abcd") 试图修改文字字符串。

所有文字字符串实际上都是只读的,不能修改。尝试修改文字字符串会导致 undefined behavior

你需要使用一个非常量数组并传递一个指向它的第一个元素的指针才能工作:

char string[40] = "abcd";
printf("\n%s\n", capitalize(string));

另一方面,您的代码使用了magic numbers,这很糟糕,而且您的代码只能使用特定的编码 (ASCII)。

要使您的程序可移植,请使用toupper 函数:

char *capitalize(char *str)
{
    for(size_t i = 0; str[i] != '\0'; i++)
        str[i] = toupper(str[i]);

    return str;
}

我还更改了循环条件以检查字符串空终止符。

【讨论】:

  • 这个问题来自我的教授给我们的教科书,在我试图回答的具体问题中,我必须使用的具体函数调用是“strcpy(string, Capitalize( “你好世界!”));”它带有一个字符串文字,所以我无法更改它。我有没有办法用字符串文字来完成这个?而且我们还不允许使用“toupper”功能,因为这是我们稍后会讨论的内容。谢谢你的帮助,我希望能收到你的回复。我还编辑了我发布的问题以将问题包含在教科书中。
  • @JordanSibug 您可以通过创建一个 new 字符串来做到这一点,并将旧的内容复制到新的同时大写。创建一个不会导致其他问题的新字符串的唯一方法是创建一个大小正确的static 数组(记住字符串空终止符)。
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多