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

时间:2011-06-15 04:04:00

标签: c

我想将for循环组合成单个for循环。我怎么能这样做?

我想循环遍历a到z,以及A到Z,如下所示:

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

但使用单个循环。

13 个答案:

答案 0 :(得分:23)

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

应该工作 - 尽管请,请不要对你的开发人员造成这种情况。

答案 1 :(得分:22)

我个人喜欢这个解决方案,但是:

char * letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for (char * ptr = letters; *ptr != 0; ++ptr) {
    char ch = *ptr;
    ...
} 

答案 2 :(得分:3)

您可以在嵌套循环(两个循环,但只有一个主体)中执行此操作:

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

答案 3 :(得分:3)

嗯,显而易见的问题是为什么? ......第二个问题是你关心非ASCII字符集(因为你的两个循环将因EBCDIC而失败),但连接两者的快速而肮脏的方式是

for (ch = 'A'; ch <= 'z'; ch++) {
    if (ch > 'Z' && ch < 'a') ch = 'a';
     :

答案 4 :(得分:2)

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

答案 5 :(得分:1)

试试这个:

        for (int i = 0; i < 52; ++i)
            printf("%c\n", 'A' + i + ('a' - 'Z' - 1) * (i/26));

答案 6 :(得分:0)

for (int i=0;i<26;++i) {

     char ch = 'A' + i;
     // Logic for Uppercase letters.

     char ch1 = 'a' + i;
     // Logic for Lowercase letters.

}

答案 7 :(得分:0)

#include<stdio.h>
#include<conio.h>
int main()
{
    int i;
    char e;
    for(i=65;i<=122;i++)
    {
                        if(i<91||i>96)
                        {
                            e=i;
                        printf("%c\n",e);
                        }
                        }

    getch();
}

答案 8 :(得分:0)

一个简单的解决方案是

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

P.S。科比,我在你的一条评论中看到你的循环的原因是检查一个字符是否是一个字母......但循环是一种可怕的方式来做到这一点。你可以简单地做

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的几个可恶方面之一。)

答案 9 :(得分:0)

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
}

答案 10 :(得分:-1)

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

答案 11 :(得分:-1)

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

}

答案 12 :(得分:-2)

for (ch = 'A';ch <= 'z';ch++) {

}

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