Как я могу написать сингл для цикла, выполняющегося от a до z и от A до Z в C?

Я хочу объединить оба цикла for в single for loop. Как я могу это сделать?

Я хочу перебирать через a в z и от A до Z, например:

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

но с использованием одного цикла.

Мне лично не нравится это решение, но:

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

Должен работать - хотя, пожалуйста, пожалуйста, не навязывайте это своим коллегам-разработчикам.

Вы можете сделать это в вложенном цикле (два цикла, но только одно тело):

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

Ну, очевидный вопрос: почему? … и второй вопрос: вам не нравятся наборы символов, отличные от ASCII (поскольку ваши две петли не срабатывают для EBCDIC), но быстрый и грязный способ подключения этих двух

 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; //... } 

Попробуй это:

  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(); } 

Простое решение

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

хотя я предпочитаю, особенно в разумных языках, которые допускают вложенные функции,

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

PS Кобе, я вижу в одном из ваших комментариев, что ваша причина для циклов - проверить, является ли символ буквой ... но цикл - это ужасный способ сделать это. Вы могли бы просто сделать

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

или, что значительно лучше,

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

(Чтобы понять, зачем этот актер нужен, прочитайте страницу isalpha man и стандарт языка C. Это один из нескольких отвратительных аспектов C.)

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

Этот подход похож на Billy's, но с немного менее неприятным утверждением цикла. Я бы не прочь нанести это на другого разработчика, хотя я мог бы написать инструкцию increment как функцию, чтобы уточнить, был ли сложный оператор increment более сложным:

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

Это бессмысленно, просто используйте один для цикла. Переменные в основном используются в качестве счетчиков или границ для цикла, поэтому он знает, когда прекращать работу. Просто сделайте один цикл. Две петли совершенно не нужны.

 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++) { } 

Это также будет содержать несколько символов, таких как «['и»] ...