我有以下字符串函数:
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开始。但是我应该如何初始化字符串?
答案 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
的索引。