C 我的角色搜索循环
我正在做一个项目,从文件中扫描任何迷宫。然而,我被困在我的字符搜索循环中:它将搜索'S'或'S'字符,但在这之后,它不会注册'E'或'E'的位置 我添加了故障排除语句,其中它打印出它正在运行的“状态”,就像一个C 我的角色搜索循环,c,C,我正在做一个项目,从文件中扫描任何迷宫。然而,我被困在我的字符搜索循环中:它将搜索'S'或'S'字符,但在这之后,它不会注册'E'或'E'的位置 我添加了故障排除语句,其中它打印出它正在运行的“状态”,就像一个printf(“”)语句,但测试甚至没有打印出来 我在MacOSX上使用Xcode 这是迷宫: ############ #...#......# S.#.#.####.# ###.#....#.# #....###.#.E ####.#.#.#.# #..#.#.#.#.# ##.#.#
printf(“”)代码>语句,但测试甚至没有打印出来
我在MacOSX上使用Xcode
这是迷宫:
############
#...#......#
S.#.#.####.#
###.#....#.#
#....###.#.E
####.#.#.#.#
#..#.#.#.#.#
##.#.#.#.#.#
#........#.#
######.###.#
#......#...#
############
字符之间没有空格
int main()
{
int i, j;
char Maze_array[Size][Size];
int Srow=0, Scol=0;
int Erow=0, Ecol=0;
int flag = 0;
FILE * Maze;
Maze = fopen( File, "r");
if (Maze == NULL)
printf("Erorr in locating file");
else
{
// scans the file into a 2Dimensional array
for (i = 0; i <= Size - 1; i++)
{
for ( j = 0; j <= Size - 1; j++)
{
fscanf(Maze, "%c" ,&Maze_array[i][j]);
}
}
// prints the maze scaned from the file A extra step into making sure its the right maze as well
printf("Here is the scaned Maze: \n");
for ( i= 0; i <= Size - 1; i++)
{
for ( j = 0; j <= Size - 1; j++)
{
printf("%c" ,Maze_array[i][j]);
}
}
// Finds the starting "cell"
printf("\n\nFinding Starting Position");
for (i = 0; i <= Size -1; ++i)
{
if ((Maze_array[0][i] == 'S') || (Maze_array[0][i] == 's'))
{
Srow=0;
Scol=i;
flag = 1;
}
else if ((Maze_array[i][0] == 'S') || (Maze_array[i][0] == 's'))
{
Srow=i;
Scol=0;
flag = 1;
}
else if ((Maze_array[Size-1][i] == 'S') || (Maze_array[Size-1][i] == 's'))
{
Srow=Size - 1;
Scol=i;
flag = 1;
}
else if ((Maze_array[i][Size-1] == 'S') || (Maze_array[i][Size-1] == 's'))
{
Srow=i;
Scol=Size - 1;
flag = 1;
}
}
printf("\nStarting Location:\n");
printf("Row:%i Column:%i",Srow, Scol);
// Finds the ending "cell"
printf("\n\nFinding Ending Position");
for (i = 0; i <= Size - 1; ++i)
{
if ((Maze_array[0][i] == 'E') || (Maze_array[0][i] == 'e'))
{
Erow=0;
Ecol=i;
flag = 1;
printf("Found Ending Location1");
}
else if ((Maze_array[i][0] == 'E') || (Maze_array[i][0] == 'e'))
{
Erow=i;
Ecol=0;
flag = 1;
printf("Found Ending Location2");
}
else if ((Maze_array[i][Size-1] == 'E') || (Maze_array[i][Size-1] == 'e'))
{
Erow=i;
Ecol=Size - 1;
flag = 1;
printf("Found Ending Location3");
}
else if ((Maze_array[Size-1][i] == 'E') || (Maze_array[Size-1][i] == 'e'))
{
Erow=Size - 1;
Ecol=i;
flag = 1;
printf("Found Ending Location4");
}
}
printf("\nEnding Location:\n");
printf("Row:%i Column:%i",Erow, Ecol);
}
printf("\n\n");
return 0;
}
寻找起始位置
起始位置:
行:2列:0
寻找结束位置
结束位置:
行:0列:0
程序以退出代码结束:0在包含迷宫的输入文件中,每行文本都以换行符(\n
)终止。在将迷宫读入迷宫数组时,如果读取的字符是\n
,则应忽略它。在代码中
for (i = 0; i <= Size - 1; i++)
{
for ( j = 0; j <= Size - 1; j++)
{
fscanf(Maze, "%c" ,&Maze_array[i][j]);
}
}
如果使用这种方式,则在打印扫描的阵列时,必须手动打印换行符。
这样做:
使用您的方法,如果Size
(您应该在问题中包含它的值)的值为4,则不会检查位置(1,1)、(1,2)、(2,1)等,仅举几个例子
我建议你这样做:
for(i=0; i<Size; ++i)
{
for(j=0; j<Size; ++j)
{
if ((Maze_array[i][j] == 'S') || (Maze_array[i][j] == 's'))
{
Srow=i;
Scol=j;
flag = 1;
}
}
}
用于(i=0;i继续评论,您尝试使用fscanf
进行面向字符的输入,使事情变得比需要的更具挑战性。fscanf
对于新的C程序员来说有许多微妙的缺陷。fscanf
对于格式化输入最有用,但即使如此,对于粗心的人来说也有许多缺陷有效的选择是使用面向行的输入(例如,fgets
或POSIXgetline
),然后解析每行所需的内容
但是,由于您是从面向字符的角度来实现这一点的,请将C-toolbox中的适当工具与作业相匹配。使用getchar
从stdin
读取,或使用fgetc
从打开的文件流读取(您也可以使用getc
,但它可以作为宏实现)。然后您所关心的就是测试EOF
以结束读取循环,否则,只需在读取文件时处理文件中的每个字符(考虑每行末尾的'\n'
)
以这种方式简单地处理它远比为文件中的每个字符单独调用variadicfscanf
函数有效
将这些片段放在一起,注意如果您想将输入保存到2D数组中,这取决于您,但无需确定输入文件中的s | | s
和e | | e
位置。(注意:要读取的文件名作为程序的第一个参数提供,如果未提供文件名,则默认情况下从stdin
读取)例如
示例使用/输出
$ ./bin/sechar <dat/sefile.txt
############
#...#......#
S.#.#.####.#
###.#....#.#
#....###.#.E
####.#.#.#.#
#..#.#.#.#.#
##.#.#.#.#.#
#........#.#
######.###.#
#......#...#
############
S found at ( 2, 0)
E found at ( 4, 11)
$。/bin/sechar这可能是开始学习如何使用调试器的好时机。逐行检查每一行代码,并检查变量。fscanf(迷宫、%c、&Maze_数组[i][j])
可能正在阅读新行。向我们显示迷宫文件和大小
。不显示链接,不显示图像。和大小Plz!您在打印迷宫时没有任何printf(“\n”)
,但仍然将其视为一个表,这意味着\n
在迷宫阵列中。
printf("Here is the scaned Maze: \n");
for ( i= 0; i < Size; i++)
{
printf("\n"); //Add this for newlines
for ( j = 0; j < Size; j++)
{
printf("%c" ,Maze_array[i][j]);
}
}
for (i = 0; i <= Size -1; ++i)
{
if ((Maze_array[0][i] == 'S') || (Maze_array[0][i] == 's'))
{
Srow=0;
Scol=i;
flag = 1;
}
else if ((Maze_array[i][0] == 'S') || (Maze_array[i][0] == 's'))
{
Srow=i;
Scol=0;
flag = 1;
}
else if ((Maze_array[Size-1][i] == 'S') || (Maze_array[Size-1][i] == 's'))
{
Srow=Size - 1;
Scol=i;
flag = 1;
}
else if ((Maze_array[i][Size-1] == 'S') || (Maze_array[i][Size-1] == 's'))
{
Srow=i;
Scol=Size - 1;
flag = 1;
}
}
for(i=0; i<Size; ++i)
{
for(j=0; j<Size; ++j)
{
if ((Maze_array[i][j] == 'S') || (Maze_array[i][j] == 's'))
{
Srow=i;
Scol=j;
flag = 1;
}
}
}
#include <stdio.h>
int main (int argc, char **argv) {
int c, row = 0, col = 0, /* c must be type 'int' to test EOF */
srow = 0, scol = 0,
erow = 0, ecol = 0,
schar = 0, echar = 0; /* save char 's' || 'S', 'e' || 'E' */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
while ((c = fgetc (fp)) != EOF) /* read each char in file */
{
if (c == 's' || c == 'S') { /* handle 's' || 'S' */
schar = c;
srow = row;
scol = col++;
} else if (c == 'e' || c == 'E') { /* handle 'e' || 'E' */
echar = c;
erow = row;
ecol = col++;
} else if ( c == '\n' ) { /* handle '\n' */
row++;
col = 0;
} else /* everything else */
col++;
putchar (c); /* output each char */
}
if (schar) /* if 's' || 'S' found */
printf ("\n%c found at (%2d, %2d)\n", schar, srow, scol);
if (echar) /* if 'e' || 'E' found */
printf ("%c found at (%2d, %2d)\n", echar, erow, ecol);
if (fp != stdin) fclose (fp); /* close file if not stdin */
return 0;
}
$ cat dat/sefile.txt
############
#...#......#
S.#.#.####.#
###.#....#.#
#....###.#.E
####.#.#.#.#
#..#.#.#.#.#
##.#.#.#.#.#
#........#.#
######.###.#
#......#...#
############
$ ./bin/sechar <dat/sefile.txt
############
#...#......#
S.#.#.####.#
###.#....#.#
#....###.#.E
####.#.#.#.#
#..#.#.#.#.#
##.#.#.#.#.#
#........#.#
######.###.#
#......#...#
############
S found at ( 2, 0)
E found at ( 4, 11)