gpt4 book ai didi

c - 尝试在用户定义的函数中操作 char 数组的元素时收到错误

转载 作者:行者123 更新时间:2023-11-30 14:32:48 24 4
gpt4 key购买 nike

我一直在尝试操作字符串“Hello World!”的元素。在主函数中找到。我的目标是将“Hello World!”的小写字母大写。在函数“大写”内,但它不允许我这样做。我尝试返回字符串而不操作它的任何元素,它工作得很好,但是一旦我包含了将小写字符转换为大写字符的代码部分,就会出现运行时错误,提示“Thread 1: EXC_BAD_ACCESS (code=2,地址=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!”作为变量字符串的值。

最佳答案

问题是 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;
}

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

关于c - 尝试在用户定义的函数中操作 char 数组的元素时收到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com