0

我有一个程序要开发,但我在某个部分遇到了一些困难。我必须阅读一些t将要进行的测试()。之后,我必须读取一些 ( n) 列和行来制作方阵² (nxn)。在矩阵实例化之后,程序必须从用户的输入中填充它。用户将键入.或。基于这种模式,我必须填充矩阵。用户将键入的每一行都必须包含字符(或) ,并且他将键入 n 次。这将填充矩阵(n 个字符乘 n 行)。你们能帮我一把吗?bwn.bw

这是我的代码:

int main(void)
{
    //vars
    int n = 0, t = 1, x = -1, y = -1, teste = 1;
    int i,j;
    //Start
    scanf(" %d %*c",&t);//scans t
    while (t-- > 0) {
        scanf(" %d", &n);//scans n
        if(n>0 && n < 100){
            int table[n][n];//the matrix n x n
            for (i = 0; (i < n);++i) {//iterator to lines
                char l[n];
                scanf ("%s", l); //scans a line
                for (j = 0; j < n; ++j) {//iterator to colums
        //these ifs are to identfy the input
                   if (l[j] == 'b'){
                        table[i][j]=1;
                    }else if(l[j] == 'w'){
                        table[i][j]=2;
                        x=j;y=i;
                    }else{
                        table[i][j]=0;
                    }
                }
        }
    }
    return 0;
}

我在 Java 中做了完全相同的事情并且它有效。我哪里失败了?

4

1 回答 1

1

您的变量l不允许有足够的空间在字符串末尾存储空值。因此,您会溢出到其他一些变量中,这可能会影响各种事情。

您可能应该将该行读入一个更大的字符串,并确保它的长度正确。您还应该对每个读取操作进行错误检查;您还应该报告输入中的无效字符。

这段代码对我有用。请注意它回显数据的方式,以便可以查看出了什么问题。错误报告应该是标准错误;我一直很懒。

#include <stdio.h>
#include <string.h>

static void dump_board(FILE *fp, const char *tag, int n, int table[n][n])
{
    fprintf(fp, "%s: (%d x %d)\n", tag, n, n);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (table[i][j] == 0)
                putc('=', fp);
            else if (table[i][j] == 1)
                putc('B', fp);
            else if (table[i][j] == 2)
                putc('W', fp);
            else
                putc('?', fp);
        }
        putc('\n', fp);
    }
}

int main(void)
{
    int n = 0, t = 1, x = -1, y = -1;

    if (scanf(" %d %*c", &t) != 1)
    {
        printf("Failed to read t\n");
        return 1;
    }
    printf("%d data sets\n", t);

    while (t-- > 0)
    {
        if (scanf(" %d", &n) != 1)
        {
            printf("Failed to read n\n");
            return 1;
        }

        printf("Size of data set: %d x %d\n", n, n);
        int c;
        while ((c = getchar()) != EOF && c != '\n')
            ;

        if (n > 0 && n < 100)
        {
            int table[n][n];
            for (int i = 0; i < n; i++)
            {
                char line[4096];
                if (fgets(line, sizeof(line), stdin) == 0)
                    break;
                int len = strlen(line);
                if (line[len-1] != '\n')
                {
                    printf("Format error: line too long (%d bytes)\n", len);
                    return 1;
                }
                line[--len] = '\0';
                if (len != n)
                {
                    printf("Format error: line <<%s>> is not length %d\n", line, n);
                    return 1;
                }
                for (int j = 0; j < n; ++j)
                {
                    if (line[j] == 'b')
                        table[i][j] = 1;
                    else if (line[j] == 'w')
                    {
                        table[i][j] = 2;
                        x = j;
                        y = i;
                    }
                    else if (line[j] == '.')
                        table[i][j] = 0;
                    else
                    {
                        printf("Format error: invalid character %c\n", line[j]);
                        return 1;
                    }
                }
            }
            dump_board(stdout, "Input", n, table);
            printf("Last white piece at (%d,%d)\n", x, y);
        }
    }
    return 0;
}

输入

2x
4
b..w
.bw.
.b.b
w.w.
8
b.w.b.w.
.w.b.w.b
bbwwbbww
b......w
ww....bb
bwb..wbw
bbbbwwww
........

输出

2 data sets
Size of data set: 4 x 4
Input: (4 x 4)
B==W
=BW=
=B=B
W=W=
Last white piece at (2,3)
Size of data set: 8 x 8
Input: (8 x 8)
B=W=B=W=
=W=B=W=B
BBWWBBWW
B======W
WW====BB
BWB==WBW
BBBBWWWW
========
Last white piece at (7,6)
于 2013-04-19T04:09:09.093 回答