scanf中的额外/缺少字符

时间:2015-12-06 14:34:26

标签: 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

它应该打印Invalid input.,因为第二个条目有4个字符而不是3个。同样,如果我写了2个字符而不是3个,它也应该打印错误信息。

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

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

1 个答案:

答案 0 :(得分:1)

如果要断言用户在矩阵的每一行的单独行中输入字符,请使用x读取一行并手动解析此行,跳过空格字符并适当处理接受的字符。到达矩阵行的末尾后,如果该行中还有非空格字符,则会抱怨。

顺便说一句,如果角色被接受,您只应增加x。在当前版本中,即使检测到错误的字符,也会增加$scope.submit = function () { // get object from form data var formData = { firstName: $scope.firstName, lastName: $scope.lastName, date: getDateFromatted(), posted: false }; addStoredData(formData, ENQUIRY_STORE); // FIRE UP THE FUNCTION $scope.enquiries(); }