tolower()函数问题

时间:2012-09-09 08:23:08

标签: c unix tolower

这是我的示例代码:

#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()函数还会转换一个char而不是strlen(a)(它是一个随机字符),例如这是一个输出:

ASDSA
asdsa
%

我该如何解决?

3 个答案:

答案 0 :(得分:5)

您必须在'\0'的末尾添加一个零字符(b)。

答案 1 :(得分:2)

正如其他人提到的,你需要null终止目标字符串。除此之外,请注意您在循环的每次迭代中重新计算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';
}

答案 2 :(得分:1)

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