为什么最后一个字符是“?”在这个字符串函数中

时间:2019-09-08 01:08:48

标签: c

我有以下字符串函数:

char * to_upper(const char * str) {

    char * upper = malloc(strlen(str)+1);   
    int i;

    for (i=0; str[i] != 0; i++)
        upper[i] = toupper(str[i]);

    upper[i+1] = '\0';

    return upper;

}

但是,当我调用它时,它会在末尾添加一个"?"(可能是无效字符)。如果我将最后一行从upper[i+1] = '\0'更改为upper[i] = '\0',它将按预期工作。那么上面的代码怎么了?

另外,这是分配字符串的正确方法吗?

char * upper = malloc(strlen(str)+1);

或者我应该这样做:

char upper[strlen(str)+1];

更新:我的上面的错误是因为长度从1开始,索引从0开始。但是我应该如何初始化字符串?

2 个答案:

答案 0 :(得分:4)

您的代码很好,您只需要删除发现的+1。当str[i]等于'\0'时,for循环结束,因此也应该将upper[i]设置为'\0'

您的字符串初始化很好。

答案 1 :(得分:-1)

我固定了答案,并附有评论:

char * to_upper(const char * str) {

  char* upper = malloc(strlen(str));   
  int i;

  for (i=0; str[i] != '\0'; i++)
      upper[i] = toupper(str[i]);

  upper[i] = '\0';

  return upper;
}

通过评论,我看到了我和您的逻辑中的错误。空字符串已经存在,因此我们不在str[i] == '\0'的for中。因此我们知道i是我们需要在\0中设置为upper的索引。