我正在尝试编写一个函数(大写),它将字符串中的所有小写字符转换为它们的大写字母。
但是,我的代码中出现了总线10错误。我知道字符串文字不能在C中修改;所以,我不确定这是否是正确的做法。
我的代码如下:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
int uppercase(char source[])
{
int i;
for(i=0; i<=strlen(source); ++i)
if (source[i]>= 'a' && source[i]<= 'z')
source[i]= source[i]-'a' +'A';
else
source[i]=source[i];
}
int main(){
uppercase("cold");
return 0;
}
理想情况下,此函数应返回COLD。我认为错误在于我的整个if语句。
答案 0 :(得分:5)
您遇到崩溃的原因是您的代码修改了字符串文字。字符串文字中的字符放在受保护的内存区域中,因此不能更改:它是未定义的行为。
替换此
uppercase("cold");
用这个:
char cold[] = "cold";
uppercase(cold);
现在字符串的字符放在可修改的内存区域中,允许您根据需要进行更改。
答案 1 :(得分:0)
你甚至不知道它就绝对使用指针。
在你的功能定义中
int uppercase(char source[])
编译器将 char source[]
视为指向char(char *source
)
因此,当将字符串文字传递给uppercase()
时,您只需传递它的地址即可。然后在你的函数中你试图修改它导致未定义的行为。
此外,您无法返回整个数组,因此您只需返回指向它的指针。
char *uppercase(char source[])
{
int i;
size_t len = strlen(source);
char *tmp;
tmp = malloc(len+1);
if (tmp!=NULL){
memcpy(tmp, source, len+1);
for(i=0; i<len; ++i){
if (tmp[i]>= 'a' && tmp[i]<= 'z'){
tmp[i]= tmp[i]-'a' +'A';
}
}
}
return tmp;
}
然后:
int main(){
char *str = uppercase("cold");
printf("%s", str);
free(str);
return 0;
}
您完成代码:http://ideone.com/BJHDIF