我在C中创建自己的toUpper函数,但每次尝试运行时都会出现分段错误。任何人都可以向我提供有关如何解决此问题的任何提示吗?
int toUpper(char *str)
{
int i;
for(i=0;i< i <= strlen(str); i++) {
if(str[i] >= 97 && str[i] <= 122) {
str[i] = str[i] -32;
}
}
return(str[i]);
}
int main()
{
char string[20];
printf("Enter any string:\n");
scanf("%s", string);
char result= (char)(toUpper(string));
printf("The string in upper case is:%s\n", result);
}
答案 0 :(得分:7)
你正在离开字符串的末尾:
for(i=0;i< i <= strlen(str); i++) {
^--
e.g。一个10字符串的字符串为0-> 9,但是你循环0-> 10。将<=
更改为<
,然后停在9。
另外,您没有对scanf设置任何限制,因此如果有人输入21个字符串,您将超出已分配string
数组的存储空间。
答案 1 :(得分:2)
建议将toUpper()
更改为:
char *toUpper(char *str) {
size_t len = strlen(str);
size_t i;
for (i = 0; i < len; i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
str[i] = str[i] - 'a' + 'A';
}
}
return str;
}
使用正确的索引范围i < strlen(str)
与i <= strlen(str)
。这是主要问题。 @Marc B
更改退货类型。由@Weather Vane推荐。例如strcpy()
,strcat()
计算字符串长度一次,而不是多次。
使用符合您目标的文字:'a'
而不是97
。 @marsh
使用size_t
作为索引和长度。这是strlen()
返回的类型,是用于数组访问的最佳类型。与巨大的字符串有所不同,但不是这些简单的例子。
此代码依赖于ASCII。这通常没问题,但不是完全可移植的。
根据@ user295691
-'a' + 'A'
醇>
答案 2 :(得分:1)
printf("The string in upper case is:%s\n", result);
结果应该是char *但是是char。这可能是您的seg故障发生的地方。其他地方包括:
scanf("%s", string);
如果输入的字符串超过19个字符,则由于字符串只有20个字符长,可能会出现问题
for(i=0;i< i <= strlen(str); i++) {
如果str出于任何原因没有结尾0,你也可以在那里出错。
答案 3 :(得分:1)
代码中的另一个主要问题是for循环语句。
for(i=0;i< i <= strlen(str); i++)
^ ^
这可能是一个错字,但是i&lt;我&lt;不会工作。