0

我在 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);
}
4

4 回答 4

7

你跑完了字符串的结尾:

for(i=0;i< i <= strlen(str); i++) {
              ^--

例如,一个 10 字符的字符串包含字符 0->9,但您循环的是 0->10。更改<=为,<让您在 9 点停止。

另外,你没有对你的 scanf 设置任何限制,所以如果有人输入一个 21 字符的字符串,你将超过你为string数组分配的存储空间。

于 2014-10-28T20:32:57.853 回答
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;
}
  1. 使用正确的索引范围i < strlen(str)i <= strlen(str). 这是主要问题。@马克乙

  2. 更改返回类型。由@Weather Vane 建议。像strcpy()strcat()

  3. 计算字符串长度一次,而不是多次。

  4. 使用符合您目标的文字:'a'而不是97. @沼泽

  5. 用于size_t索引和长度。那是返回的类型,strlen()并且是用于数组访问的最佳类型。对巨大的字符串产生影响,但对这些简单的例子却没有。

  6. 此代码确实依赖于 ASCII。这通常没问题,但不是完全可移植的。

  7. 将 32 更改为-'a' + 'A'每个 @user295691

于 2014-10-28T20:51:11.890 回答
1
printf("The string in upper case is:%s\n", result);

结果应该是一个char *,但它是一个char。这可能是您的段错误发生的地方。其他地方包括:

scanf("%s", string);

如果输入的字符串超过 19 个字符,您可能会遇到问题,因为字符串只有 20 个字符长

  for(i=0;i< i <= strlen(str); i++) {

如果 str 出于某种原因没有以 0 结尾,那么您也可以在那里进行分段错误。

于 2014-10-28T21:03:55.993 回答
1

代码中的另一个主要问题是 for 循环语句。

for(i=0;i< i <= strlen(str); i++) ^ ^

这可能是一个错字,但 i < i < 不起作用。

于 2014-10-28T21:12:38.480 回答