1

这是我的示例代码:

#include<stdio.h>
#include<string.h>
#include<ctype.h>

void convert(char *a, char *b) {
    int i;
    for(i=0; i<strlen(a); i++) {
        b[i]=tolower(a[i]);
    }
}

int main() {
    char a[20], b[20];

    fgets(a, sizeof(a), stdin);
    convert(a, b);
    printf("%s\n", b);
    return 0;
}

但有时 convert() 函数也会比 strlen(a) 多转换一个字符(它是一个随机字符),例如这是一个输出:

ASDSA
asdsa
%

我该如何解决?

4

3 回答 3

5

您必须在 .'\0'末尾添加一个空字符 ( ) b

于 2012-09-09T08:25:19.443 回答
2

正如其他人所提到的,您需要以空值终止目标字符串。除此之外,请注意,您正在重新计算a循环每次迭代的长度。这对于小字符串无关紧要,但对于大字符串,您会注意到转换时间与字符串长度的平方成正比。标准的成语是计算一次长度并重复使用。通过这两个更改,函数将如下所示:

void convert(const char *a, char *b) {
    size_t i, len = strlen(a);
    for(i = 0; i < len; i++) {
        b[i] = tolower((unsigned char) a[i]);
    }
    b[len] = '\0';
}
于 2012-09-09T09:22:24.120 回答
1

strlen 返回字符串的长度,例如 strlen("hello") 为 5。这不会复制用于终止字符串的 0 字符(这意味着内存中的字符串实际上是 6 个字符长:'h''e ''l' 'l' 'o' '0')

于 2012-09-09T08:35:13.037 回答