如何在C中小写一个字符串?


108

如何在C中将大小写混合的字符串转换为小写的字符串?


2
您是否仅使用字母az处理ASCII?
Mark Byers 2010年

1
ascii。我将如何考虑?下面的示例仍然有效吗?如果我的字符是“#”并且调用了tolower()会发生什么?
托尼·史塔克

1
那可行。我在想您的字符串中是否包含é或Ü之类的内容。
Mark Byers

1
为什么不只使用“ strlwr”?strlwr((char*)str);它只是通过字符串并将其本身转换。
拉里

@Larry这是非标准的。
中旬

Answers:


152

它在标准库中,这是实现这种功能的最直接的方法。因此,是的,只需遍历字符串并将每个字符转换为小写即可。

像这样的琐碎的事情:

#include <ctype.h>

for(int i = 0; str[i]; i++){
  str[i] = tolower(str[i]);
}

或者,如果您喜欢一种衬板,则可以使用JF Sebastian的这种衬板:

for ( ; *p; ++p) *p = tolower(*p);

35
for ( ; *p; ++p) *p = tolower(*p);似乎更惯用。
jfs

14
@JF,你去。取决于他们是否希望代码看起来吓人或好看:)(可读性很强,但确实看起来很吓人)
Earlz 2010年

如果str是a char *,这会给我一个段错误,但是如果str是一个char数组则不会。有什么解释吗?
电动咖啡

1
我相信一根衬垫会导致您失去指向弦的指针。
Ace.C

2
我相信一支班轮将有无法言喻的影响。
NOP da CALL

7

如果将自己限制为ASCII,则转换为小写字母等效于上升位0x60:

for(char *p = pstr; *p; ++p)
    *p = *p > 0x40 && *p < 0x5b ? *p | 0x60 : *p;

5
为了使它更具可读性,您可以执行for(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
Grant Peters

7
这个版本实际上比glibc的版本慢tolower()。我的机器上是55.2与44.15。
jfs

我无法想象:tolower()处理字符;仅当它是宏时
Oleg Razgulyaev 2010年

1
@oraz:tolower()具有int (*)(int)签名。这是用于性能测量的代码gist.github.com/370497
jfs

@JF:我知道,他们使用过表格,但我可以优化:for(; * p; ++ p)if(* p>'Z'){continue;} else if(* p <'A') {continue;} else {* p = * p | 0x60;}
Oleg Razgulyaev 2010年

1

您只是在处理ASCII字符串,而没有语言环境问题吗?那是的,那将是一个很好的方法。


如果在非ASCII字符上调用tolower()会发生什么?喜欢 '!' 要么 '#'。我在“#”上进行了测试,它似乎正常运行。这对于不是字母az的所有ascii字符通常是正确的吗?
托尼·史塔克

1
@hatorade:tolower()如果参数不在'A'..'Z'范围内,则保持不变。
jfs

1
!和#都是ascii字符。Mark指的是其他编码,例如UTF8,您不能假设每个字符都有一个字节(如该解决方案一样)
hdgarrood 2012年


1

如果我们要像使用一样草率tolower(),请执行以下操作:

char blah[] = "blah blah Blah BLAH blAH\0"; int i=0; while(blah[i]|=' ', blah[++i]) {}

但是,好吧,如果您输入一些符号/数字,它就会爆炸,总的来说这是邪恶的。很好的面试问题。


6
是的,这将折叠/旋转/破坏各种符号(在ASCII中,任何符号,控制字符或具有第5位清除的数字将变为具有第5位设置的相同字符代码,依此类推),因此,真的,认真地,不要用它。
Ken S

这个帖子在meta上讨论。
帕特里克·霍夫曼

0

循环指针以获得更好的性能:

#include <ctype.h>

char* toLower(char* s) {
  for(char *p=s; *p; p++) *p=tolower(*p);
  return s;
}
char* toUpper(char* s) {
  for(char *p=s; *p; p++) *p=toupper(*p);
  return s;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.