C 我的角色搜索循环

C 我的角色搜索循环,c,C,我正在做一个项目,从文件中扫描任何迷宫。然而,我被困在我的字符搜索循环中:它将搜索'S'或'S'字符,但在这之后,它不会注册'E'或'E'的位置 我添加了故障排除语句,其中它打印出它正在运行的“状态”,就像一个printf(“”)语句,但测试甚至没有打印出来 我在MacOSX上使用Xcode 这是迷宫: ############ #...#......# S.#.#.####.# ###.#....#.# #....###.#.E ####.#.#.#.# #..#.#.#.#.# ##.#.#

我正在做一个项目,从文件中扫描任何迷宫。然而,我被困在我的字符搜索循环中:它将搜索'S'或'S'字符,但在这之后,它不会注册'E'或'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
或POSIX
getline
),然后解析每行所需的内容

但是,由于您是从面向字符的角度来实现这一点的,请将C-toolbox中的适当工具与作业相匹配。使用
getchar
stdin
读取,或使用
fgetc
从打开的文件流读取(您也可以使用
getc
,但它可以作为宏实现)。然后您所关心的就是测试
EOF
以结束读取循环,否则,只需在读取文件时处理文件中的每个字符(考虑每行末尾的
'\n'

以这种方式简单地处理它远比为文件中的每个字符单独调用variadic
fscanf
函数有效

将这些片段放在一起,注意如果您想将输入保存到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)