scanf中的额外/缺失字符

scanf中的额外/缺失字符,c,input,scanf,getchar,C,Input,Scanf,Getchar,这是我的输入函数: int input( int array[500][500], int *x0, int *y0 ) { int x = 0; int y = 0; int err = 0; int temp = 0; char c; char s[2]; printf("Enter sizes:\n"); if (scanf("%d %d%c", x0, y0, &c) !=3 || *x0 <

这是我的输入函数:

int input( int array[500][500], int *x0, int *y0 ) {
    int x = 0;
    int y = 0;
    int err = 0;
    int temp = 0;
    char c;
    char s[2];
    printf("Enter sizes:\n");
    if (scanf("%d %d%c", x0, y0, &c) !=3 || 
         *x0 <= 0 || *y0 <= 0 || *x0 > 500 || *y0 > 500 || c!='\n' ) {
        printf("Invalid input.\n");
        return 0;
    }
    while (y < *y0) {
        x = 0;
        temp = 0;
        while ( x < *x0 ) { 
            if ( scanf("%1s", s)==1 ) {
                c = *s;
            } // so that ooo is written into three array fields
            switch(c) { // only these three chars are accepted
            case 'o': 
                array[y][x] = 1; 
                break;
            case '.': 
                array[y][x] = 0; 
                break;
            case '!': 
                array[y][x] = 2; 
                break;
            default: 
                err = 1; 
                break;
            }
            x++;
            temp = x;
            if (temp > *x0) // my attempt
                err = 1;
        }
        if (x != *x0)
            err = 1;
        y++;
    }
    if (y != *y0)
        err = 1;
    if (err == 1) {
        printf("Invalid input.\n");
        return 0;
    }    
    return 1;
}
它应该打印
无效输入。
,因为第二个条目有4个字符而不是3个字符。同样,如果我写了2个字符而不是3个,它也应该打印错误消息

我的想法是,每次读取字符后,我都会将该字符写入数组(如果字符被接受),然后
x++
这样我就可以将下一个输入写入下一个字段。因此,如果我有4个字符,并且只接受3个,
x
变成
4
temp
也变成
4
<代码>4>3so
err=1


那么,我的解决方案有什么问题?正确的解决方案是什么?提前感谢。

如果您想声明用户为矩阵的每一行分别输入字符,请使用
fgets()
读取一行并手动解析该行,跳过空白字符并适当处理接受的字符。到达矩阵行的末尾后,如果行中还有非空格字符,请进行投诉


顺便说一句,如果字符被接受,您应该只增加
x
。在当前版本中,即使检测到不正确的字符,也会增加
x

逻辑的哪个部分不可见?首先我写3个数字,基本上是矩阵的大小。然后我只写矩阵
o
。如果我写的矩阵是3x3,并且我输入了一行有4个字符,当然这是错误的,我需要能够发现错误。当scanf不返回1,然后什么都不返回时会发生什么。如果不是字符串,scanf将不会返回1。即使它是一个字符串,我的开关也会显示,除非它是三个字符之一,否则我的错误标志会弹出。你确定吗?检查您的逻辑如果scanf失败(为什么使用%1s是另一回事)您继续手动使用cBy parse line的上一个值,您的意思是写入临时字符数组,然后检查有多少个字母,然后将其写入我的数组?很抱歉再次打扰您。我试过玩一下,这就是我想到的:。尽管我没有更改代码中的
y
,但此代码始终在y-2条目处停止。在您引用的代码中,
fgets()
没有足够的空间读取缓冲区中第一行的
'\n'
。第二行将为空:您只需从第一行读取
'\n'
。扫描代码不会在
'\0'
处停止,此
'\0'
将被视为无效字符,设置为
err=1
。在行尾,由于在
err
上进行了测试,您将使用
y
=
1
提前中断行循环。将缓冲区设置为501字节,在
'\0'
处停止扫描,不要在无效字符或空格字符上增加
x
。我最终的工作方式是:我仍然不明白为什么不应该在无效字符上增加
x
。我的意思是,这就是
开关的作用。
默认值
具有
err=1
,因此除非读取了正确的输入,否则该标志将向上。