ascii. ¿Cómo lo tomaría en cuenta? ¿Funcionaría el siguiente ejemplo? ¿Qué sucede si mi char es un '#' y se llama a tolower ()?
Tony Stark
1
Que funcionará. Estaba más pensando si tu cadena contiene cosas como é o Ü.
Mark Byers
1
¿Por qué no usar simplemente "strlwr"? strlwr((char*)str);Simplemente pasa por la cadena y la convierte.
Larry
1
@Larry No es estándar.
mediados
Respuestas:
153
Está en la biblioteca estándar, y esa es la forma más sencilla que puedo ver para implementar dicha función. Así que sí, simplemente recorra la cadena y convierta cada carácter a minúsculas.
Algo trivial como esto:
#include<ctype.h>for(int i =0; str[i]; i++){
str[i]= tolower(str[i]);}
o si prefieres one liners, entonces puedes usar este de JF Sebastian:
Para hacerlo un poco más legible, podría hacerlofor(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
Grant Peters
7
Esta versión es más lenta que la de glibc tolower(). 55.2 vs 44.15 en mi máquina.
jfs
no puedo imaginar que: tolower () se ocupa de los caracteres; solo si es macro
Oleg Razgulyaev
1
@oraz: tolower () tiene int (*)(int)firma. Aquí está el código utilizado para las mediciones de rendimiento gist.github.com/370497
jfs
@JF: ya veo, han usado tablas, pero puedo optimizar: for (; * p; ++ p) if (* p> 'Z') {continue;} else if (* p <'A') {continue;} else {* p = * p | 0x60;}
Oleg Razgulyaev
1
¿Está tratando con cadenas ASCII y no tiene problemas de configuración regional? Entonces sí, esa sería una buena forma de hacerlo.
¿Qué sucede si se llama a tolower () en un carácter az no ascii? me gusta '!' o '#'. Lo probé en '#' y pareció funcionar bien. ¿Es esto generalmente cierto para todos los caracteres ascii que no son letras az?
Tony Stark
1
@hatorade: tolower()deja el argumento sin cambios si no está en el rango 'A' .. 'Z'.
jfs
1
! y # son caracteres ascii. Mark se refería a otras codificaciones como UTF8, donde no se puede asumir que hay un byte por carácter (como lo hace esta solución)
hdgarrood
1
Si necesita compatibilidad con Unicode en la función de minúsculas, consulte esta pregunta:
Biblioteca Unicode Light C
Sí, esto plegará / girará / mutilará una variedad de símbolos (en ASCII, cualquier símbolo, carácter de control o numeral con el bit 5 limpio se convertirá en el mismo código de carácter con el bit 5 configurado, etc.) así que realmente, en serio, no lo hagas úselo.
strlwr((char*)str);
Simplemente pasa por la cadena y la convierte.Respuestas:
Está en la biblioteca estándar, y esa es la forma más sencilla que puedo ver para implementar dicha función. Así que sí, simplemente recorra la cadena y convierta cada carácter a minúsculas.
Algo trivial como esto:
o si prefieres one liners, entonces puedes usar este de JF Sebastian:
fuente
for ( ; *p; ++p) *p = tolower(*p);
parece más idiomático.char *
, pero no si str es una matriz de caracteres. ¿Tienes alguna explicación para eso?convertir a minúsculas equivale a subir el bit 0x60 si se limita a ASCII:
fuente
for(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
tolower()
. 55.2 vs 44.15 en mi máquina.int (*)(int)
firma. Aquí está el código utilizado para las mediciones de rendimiento gist.github.com/370497¿Está tratando con cadenas ASCII y no tiene problemas de configuración regional? Entonces sí, esa sería una buena forma de hacerlo.
fuente
tolower()
deja el argumento sin cambios si no está en el rango 'A' .. 'Z'.Si necesita compatibilidad con Unicode en la función de minúsculas, consulte esta pregunta: Biblioteca Unicode Light C
fuente
Si vamos a ser tan descuidados en el uso
tolower()
, haga esto:Pero bueno, explota un poco si le das algunos símbolos / números, y en general es malvado. Sin embargo, es una buena pregunta para la entrevista.
fuente
Hacer un bucle con el puntero para obtener un mejor rendimiento:
fuente