我试图创建一个C程序来创建一个小的wordlist .txt文件。我创建了10个元素的char数组,我需要这10个字符的每个可能的4个字母组合。
所以,我想在彼此内部有4个for循环来从该数组中获取元素并创建4个字母组合并将其写入.txt。
我的问题是使用指针访问数组的元素。我在做:
char array[10] = {'A', 'S' ,'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M'};
char input[4];
char *p;
p=array;
FILE *pFile = NULL;
char *filename = "output.txt";
pFile = fopen(filename, "w");
for(i=0;i=3;i++) {
for(j=0;j=3;j++) {
for(k=0;k=3;k++) {
for(l=0;l=3;l++) {
strcpy(input, *(p+i));
strcat(input, *(p+j));//"gluing" first and second element of new string together
strcat(input, *(p+k));//same as line before
strcat(input, *(p+l));
strcat(input, "\n");
fprintf(pFile, input);
//end of for loops, closing .txt file etc.
这很好地编译并终端启动,但随后崩溃。我认为这是因为访问数组元素时出现了一些错误。
有什么想法吗? 非常感激!
其他信息>当我创建:
char string[10] = "assd";
//and insert that instead of *(p+i) anywhere it works as it is supposed to
答案 0 :(得分:1)
strcpy
和strcat
都会继续,直到找到NULL,而您的数组没有。数组中的每个插槽都是单个字符,后跟下一个单字符等。因此,strcpy将从所选字母复制到整个列表的末尾开始。最后,您还要将第5个元素(" \ n")添加到4个元素数组中。相反,这样做:
input[0] = *(p+i);
input[1] = *(p+j);
input[2] = *(p+k);
input[3] = *(p+l);
input[4] = "\n";
这应该有效。但请注意,fprintf可能是一种更简单的方法:
fprintf(pFile, "%c%c%c%c\n", *(p+i), *(p+j), *(p+k), *(p+l));
我很想继续玩#34;编码高尔夫"使用你的代码,因为从长远来看有很多东西可以改善它,但我想我会停止它的工作(虽然我觉得很惊人你的编译器接受了第一行而没有列出使用的字母引用如'A'
)。但最后一条评论是:您根本不需要p
变量。您实际上可以轻松地array[i]
轻松地在我的上方*(p+i])
。{/ p>
答案 1 :(得分:0)
#include <stdio.h>
int main(void){
char array[] = {'A', 'S' ,'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M'};
char input[5] = {0};
char *filename = "output.txt";
int size = sizeof(array)/sizeof(*array);
FILE *pFile = NULL;
int i,j,k,l;
pFile = fopen(filename, "w");
for(i=0;i<size;++i){
input[0] = array[i];
array[i] = 0;//selected
for(j=0;j<size;++j){
if(!(input[1] = array[j]))
continue;//skip
array[j] = 0;
for(k=0;k<size;++k){
if(!(input[2] = array[k]))
continue;
array[k] = 0;
for(l=0;l<size;++l){
if(!(input[3] = array[l]))
continue;
fprintf(pFile, "%s\n", input);//10*9*8*7 lines
}
array[k] = input[2];
}
array[j] = input[1];
}
array[i] = input[0];//restore
}
fclose(pFile);
return 0;
}