我该如何在C语言中将一个大小写混合的字符串转换为小写字符串?
这个函数在标准库中,这是我认为最直接的实现方式。因此,只需遍历字符串并将每个字符转换为小写即可。
像这样非常简单:
#include <ctype.h>
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
如果你喜欢一行代码,那么你可以使用 J.F. Sebastian 提供的这个:
for ( ; *p; ++p) *p = tolower(*p);
for ( ; *p; ++p) *p = tolower(*p);
这样写更符合惯用语。 - jfschar *
,那么这会给我一个segfault,但如果str是一个char数组,就不会。你有什么解释吗? - Electric Coffee将文本转换为小写字母相当于在ASCII字符集中将二进制位0x60上升:
for(char *p = pstr; *p; ++p)
*p = *p > 0x40 && *p < 0x5b ? *p | 0x60 : *p;
for(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
。这段代码将大写字母转换为小写字母,而不改变其他字符。 - Grant Peterstolower()
函数要慢。在我的机器上是55.2与44.15相比。 - jfsint (*)(int)
。这是用于性能测量的代码http://gist.github.com/370497 - jfs通过循环指针来提高性能:
#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;
}
s
是你函数中的一个本地变量,你可以直接使用它而不需要声明p
。 - NewbiZtolower()
这样的函数,就应该这样做:char blah[] = "blah blah Blah BLAH blAH\0";
int i = 0;
while( blah[i] |=' ', blah[++i] ) {}
然而,如果你输入一些符号或数字,它会爆炸,并且总体上它是邪恶的。不过这是一个不错的面试问题。
#include <ctype.h>
#include <stdio.h>
#include <string.h>
string convert_lower(string str)
{
int length = strlen(str);
char c[length + 1];
for (int i = 0; i < length; i++)
{
if (str[i] <= 'Z' || str[i] >= 'A')
{
c[i] = tolower((char)str[i]);
}
}
c[length] = '\0';
string text = c;
return text;
}
你只处理ASCII字符串,没有地域问题吗?那么是的,这将是一个不错的方法。
tolower()
函数的参数不在 'A'..'Z' 范围内,则不会改变它。 - jfs
strlwr((char*)str);
它会遍历整个字符串并将其转换为小写字母。 - Larry