Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C用户只输入整数,从scanf返回值_C_Return Value_User Input_Scanf - Fatal编程技术网

C用户只输入整数,从scanf返回值

C用户只输入整数,从scanf返回值,c,return-value,user-input,scanf,C,Return Value,User Input,Scanf,我正在尝试获取一些用户输入,我希望确保他们输入整数,如果他们不输入,我将要求他们再次输入(循环直到他们正确输入) 我已经找到了很多不同的方法来做到这一点;有些比其他更复杂。但我发现这种方法似乎很有效 但我真的不明白为什么要在代码中进行测试: scanf("%d%c", &num, &term) != 2 我可以理解,scanf输出成功匹配和分配的项数,但我不明白为什么它输出2,如果它是整数 C语言中的代码是: int main(void) { int num;

我正在尝试获取一些用户输入,我希望确保他们输入整数,如果他们不输入,我将要求他们再次输入(循环直到他们正确输入)

我已经找到了很多不同的方法来做到这一点;有些比其他更复杂。但我发现这种方法似乎很有效

但我真的不明白为什么要在代码中进行测试:

scanf("%d%c", &num, &term) != 2
我可以理解,
scanf
输出成功匹配和分配的项数,但我不明白为什么它输出2,如果它是整数

C语言中的代码是:

int main(void)
{
    int num;
    char term;

    if (scanf("%d%c", &num, &term) != 2 || term != '\n')
        printf("failure\n");
    else
        printf("valid integer followed by enter key\n");
}
尝试将其放入循环:

int main(void){

int m, n, dis;
char m_check, n_check, dis_check;

do{
    m = 0; n = 0; dis = 0;
    m_check = ' '; n_check = ' '; dis_check = ' ';

printf("Please enter number of rows m in the matrix (integer): ");
if(scanf("%d%c", &m, &m_check) !=2 || m_check != '\n')
        m_check = 'F';

printf("Please enter number of columns n in the matrix (integer): ");
if(scanf("%d%c", &n, &n_check) !=2 || n_check != '\n')
            n_check = 'F';

printf("Should the random numbers come from a uniform or normal distribution?... 
Please press 1 for uniform or 2 for normal: ");
if(scanf("%d%c", &dis, &dis_check) !=2 || dis_check != '\n' || dis != 1 || dis !=2)
            dis_check = 'F';

}while(m_check == 'F'  || n_check == 'F' || dis_check == 'F');

我试着输入m=3,n=3,dis=2,然后循环重新开始,让我输入行数。如果我被要求按f或其他什么,它就会在printf语句上疯狂地循环:)

scanf
返回它转换的字段数。您有格式字符串
%d%c
;它有:

  • %d
    -第一个字段
  • %c
    -第二个字段
  • 所以
    scanf
    返回2

    如果用户输入一个数字,例如
    123
    并按Enter键,则您的
    num
    将等于
    123
    ,而
    术语将为
    \n

    如果用户输入一个末尾带有垃圾的数字,例如
    123垃圾
    并按Enter键,则您的
    num
    将等于
    123
    将为
    g
    ,并且
    arbage\n
    将保留在输入缓冲区中

    在这两种情况下,
    scanf
    读取
    int
    char
    ,因此返回2

    另一个示例:用户输入
    垃圾123
    。在这种情况下,
    scanf
    将无法读取整数,并返回0


    因此,您的代码会检查两种不同形式的错误输出。

    scanf
    返回它转换的字段数。您有格式字符串
    %d%c
    ;它有:

    scanf("%d%c", &num, &term) != 2 
    
  • %d
    -第一个字段
  • %c
    -第二个字段
  • 所以
    scanf
    返回2

    如果用户输入一个数字,例如
    123
    并按Enter键,则您的
    num
    将等于
    123
    ,而
    术语将为
    \n

    如果用户输入一个末尾带有垃圾的数字,例如
    123垃圾
    并按Enter键,则您的
    num
    将等于
    123
    将为
    g
    ,并且
    arbage\n
    将保留在输入缓冲区中

    在这两种情况下,
    scanf
    读取
    int
    char
    ,因此返回2

    另一个示例:用户输入
    垃圾123
    。在这种情况下,
    scanf
    将无法读取整数,并返回0

    因此,您的代码检查两种不同形式的错误输出

    scanf("%d%c", &num, &term) != 2 
    
    这将检查
    scanf
    返回值。它将
    返回正确匹配的参数数。因此,如果输入了一个
    整数
    和一个字符,它们将存储在vairables
    num
    term
    中,并且
    scanf
    返回值
    2

    scanf
    将不会
    返回
    2
    如果两个参数没有正确匹配,在这种情况下,
    故障
    将显示为输出

    这将检查
    scanf
    返回值。它将
    返回正确匹配的参数数。因此,如果输入了一个
    整数
    和一个字符,它们将存储在vairables
    num
    term
    中,并且
    scanf
    返回值
    2


    scanf
    将不会
    返回
    2
    如果两个参数不正确匹配,在这种情况下,
    失败
    将显示为输出。

    输入整数将与格式化程序
    %d
    匹配,并将值分配给变量
    num
    %c
    格式化程序将采用换行符('\n')并将其存储在变量
    term
    scanf
    返回正确分配的2个原因2元素(
    num
    term

    如果不输入整数,格式化程序
    %d
    将无法正确匹配,并且
    scanf
    将不会返回2,从而导致失败

    编辑:您的do while循环变得疯狂,因为您在上次扫描中的条件错误(
    dis!=1 | | dis!=2
    )。应该是

    if(scanf("%d%c", &dis, &dis_check) !=2 || dis_check != '\n' || (dis != 1 && dis !=2))
    

    输入整数将与格式化程序
    %d
    匹配,并将值分配给变量
    num
    %c
    格式化程序将采用换行符('\n')并将其存储在变量
    term
    scanf
    返回正确分配的2个原因2元素(
    num
    term

    如果不输入整数,格式化程序
    %d
    将无法正确匹配,并且
    scanf
    将不会返回2,从而导致失败

    编辑:您的do while循环变得疯狂,因为您在上次扫描中的条件错误(
    dis!=1 | | dis!=2
    )。应该是

    if(scanf("%d%c", &dis, &dis_check) !=2 || dis_check != '\n' || (dis != 1 && dis !=2))
    

    Oops-现在请看OP想知道为什么接洽失败了,并且不一定在寻找如何做。将此作为参考,因为它确实断言了基本问题:
    scanf()
    。不要将其用于用户输入


    如果代码确实需要“获取一些用户输入,并希望确保它们输入整数”,则使用
    fgets()
    获取行,然后处理输入

    将用户输入与扫描/解析混合在一起,必然会导致某些用户输入无法通过检查,在
    stdin
    中出现额外的用户输入,或不正确地等待更多输入

    // true implies success
    bool Read_int(int *value) {
      char buffer[100];
      if (fgets(buffer, sizeof buffer, stdin) == NULL) return false; // EOF or error
    
      // Now parse the input
      char *endptr;
      errno = 0;
      long number = strtol(buffer, &endptr, 10);
      if (errno)                                return false; // long overflow
      if (number < INT_MIN || number > INT_MAX) return false; // int overflow
      if (endptr == buffer)                     return false; // No conversion
      while (isspace((unsigned char) *endptr)) endptr++;
      if (*endptr)                              return false; // non-white-space after number
      *value = (int) number;
      return true;
    }
    
    //true意味着成功
    bool Read_int(int*值){
    字符缓冲区[100];
    如果(fgets(buffer,sizeof buffer,stdin)=N