我有一个基本上是单词搜索格式的随机字符文件。我希望能够将其中的所有字符都放入2d拼图数组中,这样我就能输入类似printf的内容(“值为%c”,拼图[2] [2]);并且它将打印第3行和第3列中的值(因为它从0开始......)继续我的代码到目前为止。
#define MAXROWS 60
#define MAXCOLS 60
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
main() {
char TableFileName[100];
char PuzzleFileName[100];
char puzzle[MAXROWS][MAXCOLS];
char line[MAXCOLS];
FILE *TableFilePtr;
int cols = 0;
int rows = 0;
printf("Please enter the table file name: ");
scanf("%s",TableFileName);
/* ... */
TableFilePtr = fopen(TableFileName, "r");
while (fgets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
for (cols; cols<(strlen(line)-1) && cols < MAXCOLS; ++cols) {
puzzle[rows][cols] = line[cols];
}
++rows;
}
printf("%c",puzzle[2][2]);
}
一旦程序运行,拼图[x] [y]不包含任何值。任何想法?
update1:将cols更改为cols = 0 UPDATE2:加入的printf( “\ n此行均处于%d,原子%d COLS,益智[%d,%d] =%C线[COLS] =%C”,行,COLS,行,COLS,益智[行,COLS],线[COLS]);为了循环 update3:在更新2之后,我看到行[cols]字符正在获取拼图中的每个字符,但不是正确的顺序。另外,[cols]行没有正确地放入拼图[rows] [cols]。继承了我所看到的一些东西(不知道为什么它让我把它作为代码而不是其他):
the rows are at 0, cols at 0, puzzle[0,0]=l line[cols]=A
the rows are at 0, cols at 1, puzzle[0,1]=▒ line[cols]=
the rows are at 0, cols at 2, puzzle[0,2]=▒ line[cols]=B
the rows are at 0, cols at 3, puzzle[0,3]= line[cols]=
the rows are at 0, cols at 4, puzzle[0,4]=\ line[cols]=D
the rows are at 0, cols at 5, puzzle[0,5]=▒ line[cols]=
the rows are at 0, cols at 6, puzzle[0,6]=▒ line[cols]=E
the rows are at 0, cols at 7, puzzle[0,7]= line[cols]=
the rows are at 0, cols at 8, puzzle[0,8]=L line[cols]=Q
the rows are at 0, cols at 9, puzzle[0,9]=▒ line[cols]=
the rows are at 0, cols at 10, puzzle[0,10]=▒ line[cols]=T
A,B,D,E,A,T是正确的但是...... A应该是拼图[0,0],B应该是[0,1] D应该是[0,2]等等。
继承人输入的采样器......(将在txt文件中)
K N R D J P L H X E K B W M X A M U Y A L E F Q N D L D
B D B S W W M T F B K Z D G A L V L K U N U R C R I E I
H N L A N D N T O V P O G R U U Y X E D L Y R M Q D T T
Y C G Y E M A S I E X P V Z N W H X B D G G R T K V C W
M Y C X A M I E U T Z J U O C N F F L R E F B T D R Y W
R K V A C B H G L C F D Y X R Z Q E R E H N Q D S J H T
R G E N Y Y K F J V G S C G D H O G K A F E M I S S Q P
S J Z A B V A A P E E P R K F T A H W C G B J N N L W B
F V F Z Y T V Y E O C Y A D L Q Q P P F V W K M E U V O
答案 0 :(得分:0)
当我运行你的代码时,我从拼图数组中的文本文件中获取实际值。我认为你错误地认为你把这些价值观放在哪里。我不能确定你在做什么,因为你没有包含你正在解析的例子,但我肯定在我的拼图数组中得到了值。
如果我的文件看起来像这样: 1 2 3 4 5 6 7 8 9 10 那么拼图[0]的前三个元素是“1”,“”,“2”,拼图的所有其他元素都是空的。
在玩了一下后,我意识到了什么似乎是问题。你已经将cols声明为top,并且它在循环中被重用。因此,当行增加时,您不会重置cols。添加cols = 0;在行++之后,数组似乎表现得像你需要的那样。
编辑:主要是风格的东西。
首先,你在while循环中使用for循环,对于迭代多维数组而言,这似乎很奇怪。不要误解我 - 他们基本上是一回事。但是为了便于阅读,通常情况下(while)或(for)当你用行和列做这样的事情时,我更有意义。
此外,不要在while循环结束时重置cols和递增行,而是尝试将其更改为for循环。如果你在for循环的声明中声明增量器,你就不必担心犯这些错误了,它变得更加可读IMO。
此外,最后一个注意事项 - 也许你没有意识到的事情是你必须非常小心在char数组上使用sizeof。我不会将sizeof用作fgets的maxint,因为sizeof在char数组中包含null终止符(请参阅此帖子C++: size of a char array using sizeof)
我不是专家,所以这里可能还有很多内容(有很多方法可以从文件中获取行,我不认为fgets是推荐的路径)但这就是我所能做的一切现在想起来,希望它至少可以帮助你让它正常运行。
答案 1 :(得分:0)
test.c的
#define MAXROWS 60
#define MAXCOLS 60
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
main()
{
char TableFileName[100];
char PuzzleFileName[100];
char puzzle[MAXROWS][MAXCOLS];
char line[MAXCOLS];
FILE *TableFilePtr;
int cols;
int rows;
cols=0;
rows=0;
printf("Please enter the table file name: ");
scanf("%s",TableFileName);
TableFilePtr = fopen(TableFileName, "r");
while (fgets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
char *p=line;
for(cols=0;NULL != (p=strtok(p, " \n")) && cols < MAXCOLS; ++cols){
puzzle[rows][cols]=*p;
p=NULL;
}
++rows;
}
{ //check puzzle[][] print out
int r, c;
for(r=0;r<rows;r++){
for(c=0;c<cols;c++){
printf("%c", puzzle[r][c]);
}
printf("\n");
}
}
printf("%c",puzzle[2][2]);
}
data.txt中
K N R D J P L H X E K B W M X A M U Y A L E F Q N D L D
B D B S W W M T F B K Z D G A L V L K U N U R C R I E I
H N L A N D N T O V P O G R U U Y X E D L Y R M Q D T T
Y C G Y E M A S I E X P V Z N W H X B D G G R T K V C W
M Y C X A M I E U T Z J U O C N F F L R E F B T D R Y W
R K V A C B H G L C F D Y X R Z Q E R E H N Q D S J H T
R G E N Y Y K F J V G S C G D H O G K A F E M I S S Q P
S J Z A B V A A P E E P R K F T A H W C G B J N N L W B
F V F Z Y T V Y E O C Y A D L Q Q P P F V W K M E U V O
执行程序结果:
Please enter the table file name: data.txt
KNRDJPLHXEKBWMXAMUYALEFQNDLD
BDBSWWMTFBKZDGALVLKUNURCRIEI
HNLANDNTOVPOGRUUYXEDLYRMQDTT
YCGYEMASIEXPVZNWHXBDGGRTKVCW
MYCXAMIEUTZJUOCNFFLREFBTDRYW
RKVACBHGLCFDYXRZQEREHNQDSJHT
RGENYYKFJVGSCGDHOGKAFEMISSQP
SJZABVAAPEEPRKFTAHWCGBJNNLWB
FVFZYTVYEOCYADLQQPPFVWKMEUVO
L
答案 2 :(得分:-1)
while (fgets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
/*
for (cols=0; cols<(strlen(line)-1) && cols < MAXCOLS; ++cols) {
puzzle[rows][cols] = line[cols];
}
*/
char *p=line;
for(cols=0;NULL != (p=strtok(p, " \n")) && cols < MAXCOLS; ++cols){
puzzle[rows][cols]=*p;
p=NULL;
}
++rows;
}
测试打印代码示例:
{ //check puzzle[][] print out
int r, c;
for(r=0;r<rows;r++){
for(c=0;c<cols;c++){
printf("%c", puzzle[r][c]);//do you mistake like this puzzle[r,c] ?
}
printf("\n");
}
}