2010-04-18 14 views
69

¿Cuál es la mejor/más limpia manera de convertir una cadena de mayúsculas y minúsculas en minúscula en C?c - convierte una secuencia de mayúsculas y minúsculas en todas las minúsculas

+2

¿Está tratando con ASCII solo con letras a-z? –

+0

ascii. ¿Cómo tomaría eso en cuenta? ¿seguiría funcionando el siguiente ejemplo? ¿Qué pasa si mi char es un '#' y se invoca a tolower()? – sepiroth

+1

Eso funcionará. Estaba pensando más si tu cadena contiene cosas como é o Ü. –

Respuesta

111

Está en la biblioteca estándar, y esa es la manera más directa que puedo ver para implementar dicha función. Así que sí, simplemente recorra la cadena y convierta cada carácter a minúscula.

algo trivial como esto:

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

o si lo prefiere trazadores de líneas uno, entonces se puede utilizar éste por JF Sebastian:

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

'for (; * p; ++ p) * p = tolower (* p);' parece más idiomático – jfs

+13

@ J.F. ahí tienes. Depende de si quieren que el código parezca aterrador o agradable :) (un trazador de línea muy legible, pero parece aterrador) – Earlz

+0

esto me da un segfault si str es un 'char *', pero no si str es un conjunto de caracteres. ¿Tienes alguna explicación para eso? –

2

¿Está tratando con cadenas ASCII y no tiene problemas de configuración regional? Entonces sí, esa sería una buena manera de hacerlo.

+0

¿Qué sucede si se invoca tolower() en un carácter que no es ASCII aZ? me gusta '!' o '#'. Lo probé en '#' y pareció funcionar bien. ¿Es esto generalmente cierto para todos los caracteres ascii que no son letras a-z? – sepiroth

+1

@hatorade: 'tolower()' deja el argumento sin cambios si no está en el rango 'A' .. 'Z'. – jfs

+1

! y # son ambos caracteres ascii. Mark se estaba refiriendo a otras codificaciones como UTF8, donde no puede suponer que hay un byte por carácter (como lo hace esta solución) – hdgarrood

6

para convertir a minúsculas es equivalente a subir poco 0x60:

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

(página de códigos para el latino, por supuesto)

+3

Para hacerlo un poco más legible, podría hacer 'for (char * p = pstr; * p; ++ p) * p = * p> = 'A' && * p <= 'Z'? * P | 0x60: * p; ' –

+4

Esta versión es más lenta que' tolower() 'de glibc. 55.2 vs. 44.15 en mi máquina. – jfs

+0

no puedo imaginarme lo siguiente: tolower() trata con caracteres; solo si es macro –

1

Si vamos a ser tan descuidado como para utilizar tolower(), hacer esto:

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

Pero, bueno , explota un poco si le das algunos símbolos/números, y en general es malvado. Buena pregunta de entrevista, sin embargo.

+5

Sí, esto doblará/girará/mutilará una variedad de símbolos (en ASCII, cualquier símbolo, carácter de control o numeral con el bit 5 claro se convertirá en el mismo código de carácter con el bit 5 establecido, etc.) así que, realmente, en serio, no lo haga t usarlo. –

+0

Esta publicación se trata en [meta] (http://meta.stackoverflow.com/questions/270402/is-ghetto-an-offensive-word). –

Cuestiones relacionadas