首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tolower()函数问题

tolower()函数问题
EN

Stack Overflow用户
提问于 2012-09-09 16:23:08
回答 3查看 9.5K关注 0票数 1

这是我的示例代码:

代码语言:javascript
复制
#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)多转换一个字符(它是一个随机字符),例如这是一个输出:

代码语言:javascript
复制
ASDSA
asdsa
%

我怎么才能修复它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-09 16:25:19

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

票数 5
EN

Stack Overflow用户

发布于 2012-09-09 17:22:24

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-09-09 16:35:13

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12337570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档