c - scanf 中的额外/缺失字符

标签 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 <= 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;
}

基本上如果我输入:

3 3
oooo
ooo
ooo

它应该打印无效输入。,因为第二个条目有 4 个字符而不是 3 个。同样,如果我写了 2 个字符而不是 3 个,它也应该打印错误消息。

我的尝试背后的想法是,在每次读取字符后,我将该字符写入数组(如果字符被接受),然后x++,以便我可以将下一个输入写入下一个字段。因此,如果我有 4 个字符,而只应接受 3 个字符,则 x 变为 4temp 也变为 44 > 3 所以err=1

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

最佳答案

如果您想断言用户在矩阵的每一行的单独行中输入字符,请使用 fgets() 读取一行并手动解析该行,跳过空白字符并适本地处理接受的字符。一旦到达矩阵行的末尾,如果行中剩余非空格字符,则提示。

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

关于c - scanf 中的额外/缺失字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34118542/

相关文章:

c - 编写一个函数来检查其参数(正整数)是否是完全平方数。然后将此函数应用于正整数 vector

c - 通过套接字传递链表

C、前后自增,不同程序答案不同

javascript - WinJS 渲染 listview 时捕获事件

c - 尝试打开文件时 Program.exe 停止工作

c - 为什么 scanf llu 不验证 %llu?

c - 从 C 语言的输入文件中读取特定短语

c - 如何将内存数据库文件打开到 sqlite3 中

jQuery .select() 不适用于移动设备

c++ - 解析数据,scanf?