¿Cómo puedo escribir un solo bucle for que se ejecute de la A a la Z y de la A a la Z en C?

Quiero combinar ambos bucles for en single for loop. ¿Cómo puedo hacer eso?

Quiero recorrer a la z, y la A a la Z, así:

char ch; for (ch = 'A' ; ch <= 'Z' ; ch++ ) { } for (ch = 'a' ; ch <= 'z' ; ch++ ) { } 

pero utilizando un solo bucle.

Personalmente no me gusta esta solución, pero:

 char * letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; for (char * ptr = letters; *ptr != 0; ++ptr) { char ch = *ptr; ... } 
 for (char ch = 'A' ; ch <= 'z' ; ch == 'Z' ? ch = 'a' : ++ch ) { } 

Debería funcionar, aunque, por favor, no inflijas esto a tus compañeros desarrolladores.

Puede hacerlo en un bucle nested (dos bucles, pero solo un cuerpo):

 for (start = 'A'; start <= 'a'; start += 'a' - 'A') { end = start + 'Z' - 'A'; for (ch = start; ch <= end; ++ch) { /* body */ } } 

Bueno, la pregunta obvia es ¿por qué? … y la segunda pregunta es si te interesan los conjuntos de caracteres que no son ASCII (ya que tus dos bucles fallarán para EBCDIC), pero la forma rápida y sucia de conectar los dos es

 for (ch = 'A'; ch <= 'z'; ch++) { if (ch > 'Z' && ch < 'a') ch = 'a'; : 
 const char diff = 'a' - 'A'; for (ch = 'A' ; ch <= 'Z' ; ch++ ) { char small_ch = ch + diff; //... } 

Prueba esto:

  for (int i = 0; i < 52; ++i) printf("%c\n", 'A' + i + ('a' - 'Z' - 1) * (i/26)); 
 for (int i=0;i<26;++i) { char ch = 'A' + i; // Logic for Uppercase letters. char ch1 = 'a' + i; // Logic for Lowercase letters. } 
 #include #include int main() { int i; char e; for(i=65;i<=122;i++) { if(i<91||i>96) { e=i; printf("%c\n",e); } } getch(); } 

Una solución directa es

 int i; for(i = 0; i < 52; i++){ char ch = i + (i < 26? 'A' : 'a'); /* do something with ch */ } 

Aunque prefiero, especialmente en lenguajes sensibles que permiten funciones anidadas,

 for(ch = 'A'; ch <= 'Z'; ch++) dosomething(ch); for(ch = 'a'; ch <= 'z'; ch++) dosomething(ch); 

PS Kobe, veo en uno de tus comentarios que tu razón para los bucles es verificar si un personaje es una letra ... pero hacer un bucle es una forma horrible de hacerlo. Usted podría simplemente hacer

 if(('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')){ /* c is a letter */ } 

o, considerablemente mejor,

 #include ctype.h ... if(isalpha((unsigned char)c)){ /* c is a letter */ } 

(Para entender por qué se necesita ese reparto, lea la página del manual de isalpha y el estándar del lenguaje C. Este es uno de los varios aspectos abominables de C.)

 for (char ch = 'A'; ch <= 'z'; ch = ch == 'Z'?'a':ch+1) { //loop body } 

Este enfoque es similar al de Billy, pero con una statement de incremento de bucle un poco menos desagradable. No me importaría infligir esto a un compañero de desarrollo, aunque podría escribir la statement de incremento como una función para aclarar si la instrucción de incremento se volvió más compleja:

 char nextChar(char c) { return c == 'Z' ? 'a' : c+1; } for (char ch = 'A'; ch <= 'z'; ch = nextChar(ch)) { //loop body } 

Es inútil, solo usa uno para bucle. Las variables se utilizan principalmente como contadores, o límites para el bucle, por lo que sabe cuándo terminar. Sólo haz un bucle. Dos bucles son completamente innecesarios.

 void main() { char ch; for(ch= 65 ; ch <= 122 ; ch++) { if ( ch>=91 && ch<=96) continue; //hey check this out if this helps printf("%c \n",ch); } } 
 for (ch = 'A';ch <= 'z';ch++) { } 

Esto también incluirá algunos caracteres como '[' y ']' ...