C语言 下一班为什么不开?

wj8zmpe1  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(129)

这个程序的目的是确保输入的两个0到2之间的整数是有效的,中间有一个空格(严格地说,没有别的),然后把这两个整数的结果赋给变量,由于某种原因,这是不允许的。
非常基本的类型转换让我感到困惑。print语句%i and %i从来没有运行过!我不明白为什么,即使我在标记为“success”的部分用大括号括起来。我已经尝试了很多方法。

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

int main(void)
{
    int row, column;
    char buffer[100];

    }

    printf("enter 2 values of row | column format \n");
    
    fgets(buffer,100,stdin);
    sscanf(buffer,"%c %c",&row, &column);
    printf("%i %i", row,column);

// only accepts integers between 0 and 2 inclusive
 
    if ((((int)row >=48) && ((int)row <= 50 )) && ((int)column >= 48) && ((int)column <= 50))
        {
        
        printf("success\n");
        printf("%i and %i", atoi(row), atoi(column));

        }
        
    else
        printf("fail\n");

    return 0;
}
xzlaal3s

xzlaal3s1#

很好,OP正在尝试验证输入。
要接受2 int

char dummy;  // Used to detect text after the 2 digits
if (sscanf(buffer,"%d %d %c", &row, &column, &dummy) != 2) {
  puts("Input is not 2 ints");
}

然后测试范围

if (row < 0 || row > 2 || column < 0 || column > 2) {
  puts("Outside 0 to 2 range");
}

检测int的超出范围文本所需的附加代码。类似于下面的代码,它将int的输入限制为每个1位数,并记录两个int之间的扫描偏移以确保一些空白。

int n1, n2;
if (sscanf(buffer,"%1d%n %n%1d %c", &row, &n1, &n2, &column, &dummy) != 2 || n1 == n2) {
  puts("Input is not 2 ints");
}

保存时间

启用所有编译器警告。一个好的编译器会抱怨sscanf(buffer,"%c %c",&row, &column);-"%c"需要char *,而不是int *

xqnpmsa8

xqnpmsa82#

远离scanf()系列的函数。它们是这么多SO问题的原因...
下面的内容应该很容易理解,当你醒来的时候,我很乐意为你解释任何你可能感到困惑的事情。

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

int main( void ) {
    printf("enter 2 values of row | column format \n");
    
    char buf[ 100 ];
    fgets( buf, 100, stdin );

    if( buf[3] == '\n' // fgets leaves LF in the buffer
    &&  ('0' <= buf[0] && buf[0] <= '2' )   // limit ASCII digit
    &&  buf[1] == ' '                       // single space between
    &&  ('0' <= buf[2] && buf[2] <= '2' )   // limit ASCII digit
    ) {
        int row = buf[0] - '0', col = buf[2] - '0';
        printf( "success\n%i and %i", row, col );
    } else
        puts( "fail" );

    return 0;
}

相关问题