如何在C中编写从a到z和A到Z的单个for循环?

我想将for循环组合成单个for循环。 我怎样才能做到这一点?

我想循环遍历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 */ } 

虽然我更喜欢,特别是在允许嵌套function的合理语言中,

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

PS Kobe,我在你的一条评论中看到你的循环的原因是检查一个字符是否是一个字母......但循环是一种可怕的方式来做到这一点。 你可以干脆做

 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手册页和C语言标准。这是C的几个可恶方面之一。)

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

这种方法类似于比利的方法,但有一个稍微不那么讨厌的循环增量语句。 我不介意在同伴dev上造成这种情况,尽管我可能会将增量语句写为函数来澄清增量语句是否更复杂:

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

这是毫无意义的,只需使用一个for循环。 变量主要用作循环的计数器或边界,因此它知道何时终止。 只做一个循环。 完全没有两个循环。

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

这还包括一些字符,如'['和']'......