我正在尝试生成一个字母列表,然后我要分成多个文件......
#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文件,我可能需要分成多个文件
答案 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;
}
该代码很长,因为您使用的是双倍数据:计数器i
到l
以及字符串的内容。你必须让它们保持同步,这可能会弄乱它 - 实际上在你的例子中。 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;
}