生成字母列表

时间:2014-02-04 07:17:48

标签: c

我正在尝试生成一个字母列表,然后我要分成多个文件......

#include <stdio.h> 
int main(void) 
{ 
    FILE *fp;
    char x[6] = "aaa00";
    int i, k, j, l, m;
    i = k = j = l = m = 0;
    fp=fopen("c:\\file.txt", "wb");

    while(i<26){    //when this loops is over all will be generated, letter x[0]
        i++;
        while(k<26){ //letters x[1]
            k++;
            while(j<25){ //letters x[2]
                j++;
                /*while(l<9){ //numbers 0 - 9
                    l++;
                    while(m<9){ //numbers 0 - 9
                        m++;
                        fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp);
                        x[4]++;
                    }
                    x[3]++;
                }
                l = 0;*/
                x[2]++;
            }
            x[1]++;
            j = 0;
            x[2] = 'a'; //reset
        }
        x[0]++;
        k = 0;
        x[1] = 'a'; //reset
    }

    return 0;
}

列表总共保存到10mb文件,我可能需要分成多个文件

4 个答案:

答案 0 :(得分:2)

多个嵌套循环很难看且难以管理。当你突然需要更多字符时,你需要添加循环。另外,我提到它们很难看吗?

这个问题需要递归,所以这里是:

#include <stdio.h>                                                                                  

void generate(char *str, int i)                                                                     
{                                                                                                   
    printf("%s\n", str);                                                                            

    char c = str[i];                                                                                
    if ((i < 3 && c == 'z') || (i <= 4 && c == '9'))                                                
        ++i;                                                                                        

    if (i == 5)                                                                                     
        return;                                                                                     

    ++str[i];                                                                                       
    generate(str, i);                                                                               
}                                                                                                   

int main()                                                                                          
{                                                                                                   
    char str[] = "aaa00";                                                                           
    generate(str, 0);                                                                               
}  

答案 1 :(得分:1)

因此,如果您正在尝试生成所有可能性,可能是这样的:

int i,j,k,l,m;

for(i=48; i<58; i++)

    for(j=48; j<58; j++)

        for(k=97; k<123; k++)

            for(l=97; l<123; l++)

                for(m=97; m<123; m++)

                    printf("%c%c%c%c%c\n",k,l,m,i,j);

范围48 to 58&amp; 97 to 123代表ascii值。

例如:为了更清晰,您可以将for(i=48; i<58; i++)替换为for(i='0'; i<='9'; i++)

答案 2 :(得分:1)

#include <stdio.h>
#include <string.h>

void inc_str(char *str){
    int index, carry;
    for(index = strlen(str)-1;index>=0;--index){
        if(str[index] == 'z'){
            carry = 1;
            str[index] = 'a';
        } else if(str[index] == '9'){
            carry = 1;
            str[index] = '0';
        } else {
            carry = 0;
            ++str[index];
        }
        if(carry == 0)break;
    }
}

int main(){
    char x[6] = "aaa00";

    while(1){
        printf("%s\n", x);
        if(strcmp(x, "zzz99")==0)
            break;
        inc_str(x);
    }
    return 0;
}

答案 3 :(得分:1)

要修复代码,请确保为每个循环重置计数器和字符串内容:

int xmain(void) 
{ 
    char x[6] = "aaa00";
    int i, k, j, l, m;
    i = k = j = l = m = 0;

    while(i<26){    //when this loops is over all will be generated, letter x[0]
        i++;
        while(k<26){ //letters x[1]
            k++;
            while(j<26){ //letters x[2]
                j++;
                while(l<10){ //numbers 0 - 9
                    l++;
                    while(m<10){ //numbers 0 - 9
                        m++;
                        printf("%s\n", x);
                        x[4]++;
                    }
                    m = 0;
                    x[3]++;
                    x[4] = '0'; //reset
                }
                l = 0;
                x[2]++;
                x[3] = '0'; //reset
            }
            x[1]++;
            j = 0;
            x[2] = 'a'; //reset
        }
        x[0]++;
        k = 0;
        x[1] = 'a'; //reset
    }

    return 0;
}

该代码很长,因为您使用的是双倍数据:计数器il以及字符串的内容。你必须让它们保持同步,这可能会弄乱它 - 实际上在你的例子中。 Loxxy的代码更直接。

但问题当然很有趣,你可以看到你的代码中出现了一种模式:当一个数字超过其限制时,下一个数字会增加,就像里程表一样。您可以概括此代码以在两个上限和下限之间生成所有字符串:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    const char *lo = "aaa00";
    const char *hi = "zzz99";
    char buf[6] = {0};
    int len;

    strcpy(buf, lo);
    len = strlen(buf);

    for(;;) {
        int n = len;

        printf("%s\n", buf);
        buf[n - 1]++;
        while (n-- && buf[n] > hi[n]) {
            if (n == 0) goto done;
            buf[n] = lo[n];
            buf[n - 1]++;
        }
    }
    done: return 0;
}

如果您不喜欢里程表方法,可以使用递归样式的Loxxy直接嵌套循环来概括解决方案:

#include <stdlib.h>
#include <stdio.h>

void print_combo(const char *from, const char *to, char buf[], int n)
{
    int c;

    if (from[n] == '\0' || to[n] == '\0') {
        printf("%s\n", buf);
    } else {
        for (c = from[n]; c <= to[n]; c++) {
            buf[n] = c;
            print_combo(from, to, buf, n + 1);
        }
    }
}

int main()
{
    char buf[6] = {0};

    print_combo("aaa00", "zzz00", buf, 0);

    return 0;
}