在C中创建一个toUpper函数

时间:2014-10-28 20:31:34

标签: c toupper

我在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 个答案:

答案 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;
}
  1. 使用正确的索引范围i < strlen(str)i <= strlen(str)。这是主要问题。 @Marc B

  2. 更改退货类型。由@Weather Vane推荐。例如strcpy()strcat()

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

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

  5. 使用size_t作为索引和长度。这是strlen()返回的类型,是用于数组访问的最佳类型。与巨大的字符串有所不同,但不是这些简单的例子。

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

  7. 根据@ user295691

  8. 将32更改为-'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;不会工作。