Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
理解scanf行为_C_Loops - Fatal编程技术网

理解scanf行为

理解scanf行为,c,loops,C,Loops,我对C编程非常陌生。我的长官给了这个代码,以找到n个数字的最大值。当我按照先生说的做的时候,事情是完美的,也就是说,当行输入数字时写一个数字,当数字弹出时,像7 8 9 10那样写一行数字 #include <stdio.h> main() { int n, max, number, i; printf("Type the number of numbers"); scanf("%d", &n); if(n>0) {

我对C编程非常陌生。我的长官给了这个代码,以找到n个数字的最大值。当我按照先生说的做的时候,事情是完美的,也就是说,当行输入数字时写一个数字,当数字弹出时,像7 8 9 10那样写一行数字

#include <stdio.h>
main()
{
    int n, max, number, i;
    printf("Type the number of numbers");
    scanf("%d", &n);
    if(n>0)
    {
        printf("Type the numbers");
        scanf("%d",&number);
        max=number;
        for(i=1; i<n; i++)
        {
            scanf("%d", &number);
            if(number>max)
                max=number;
        }
        printf("MAX=%d \n", max);
    }
}
#包括
main()
{
int n,max,number,i;
printf(“键入数字的数量”);
scanf(“%d”和“&n”);
如果(n>0)
{
printf(“键入数字”);
scanf(“%d”和编号);
最大值=数量;
对于(i=1;imax)
最大值=数量;
}
printf(“MAX=%d\n”,MAX);
}
}
但是如果我写的是假设-58991076,那么程序就会理解它-- 它将n=5,然后将number=8,然后循环将number更改为9,然后number更改为10,直到6,然后gves max


那么,scanf是如何在这里工作的呢?虽然数字是用空格写在一行中的,但它是单独接受数字的。

当您按下键盘时,您正在填充计算机上的缓冲区。scanf将读取连续数据量,直到它到达一个空格,因此在代码scanf(“%d”)上的“1234 43”表示“读取一个数字”,而1234是一个数字,这就是它将读取的数字

但是,如果有一个循环将再次执行scanf,则数字“43”当前在读取缓冲区中,scanf将不停止地读取它


scanf的手册没有解释这一点,对于新手来说,理解应用程序为什么不停在那里读取新的数字有点令人困惑。

当你按下键盘时,你正在填充计算机上的缓冲区。scanf将读取连续数据量,直到它到达一个空格,因此在代码scanf(“%d”)上的“1234 43”表示“读取一个数字”,而1234是一个数字,这就是它将读取的数字

但是,如果有一个循环将再次执行scanf,则数字“43”当前在读取缓冲区中,scanf将不停止地读取它


scanf的手册没有解释这一点,对于新手来说,理解为什么应用程序不停在那里读取新的数字有点让人困惑。

让我尽可能简单地解释一下

scanf
从标准输入流
stdin
读取字节

假设您提供的输入是
“23 67 21 99\n”
(该\n来自您按Enter键时的输入)


然后,下次调用
scanf
时,将开始从该输入缓冲区读取内容,并将所看到的内容解释为您告诉它的任何内容(
%d”
,等等),同时用空字符分隔输入。这可能是一个新行、一个空格、一个选项卡等


虽然仍有字节需要读取,
scanf
不会等待您输入。这就是这里发生的事情。

让我尽可能简单地解释一下

scanf
从标准输入流
stdin
读取字节

假设您提供的输入是
“23 67 21 99\n”
(该\n来自您按Enter键时的输入)


然后,下次调用
scanf
时,将开始从该输入缓冲区读取内容,并将所看到的内容解释为您告诉它的任何内容(
%d”
,等等),同时用空字符分隔输入。这可能是一个新行、一个空格、一个选项卡等

虽然仍有字节需要读取,
scanf
不会等待您输入。这就是这里发生的事情。

scanf中的
%d”
(“%d”和&number)原因有三个阶段将用户文本输入扫描到
int

  • 读取并丢弃0个或多个前导空格,如
    '
    '\n'
    '\t'
    ,以及其他一些空格

  • “123”
    “-123”
    “+123”
    这样的数字文本一直读取到读取非数字字符为止。(或文件结尾,或罕见的输入错误)

  • 对于后续的输入调用,该非数字字符被放回
    stdin

  • 如果步骤2成功读取至少1个数字,则函数返回1。好代码检查返回值

    if (scanf("%d",&number) != 1) Handle_UnexpectedInput();
    
    重要的是,
    '\n'
    对于
    scanf(“%d”、&number)没有那么特殊。它的作用类似于分隔符,类似于另一个空白或非数字文本

    '\n'
    确实会导致缓冲的
    stdin
    接受用户输入行,以便通过各种
    scanf()
    调用进行处理。

    scanf(“%d”和编号)中的
    %d”
    原因有三个阶段将用户文本输入扫描到
    int

  • 读取并丢弃0个或多个前导空格,如
    '
    '\n'
    '\t'
    ,以及其他一些空格

  • “123”
    “-123”
    “+123”
    这样的数字文本一直读取到读取非数字字符为止。(或文件结尾,或罕见的输入错误)

  • 对于后续的输入调用,该非数字字符被放回
    stdin

  • 如果步骤2成功读取至少1个数字,则函数返回1。好代码检查返回值

    if (scanf("%d",&number) != 1) Handle_UnexpectedInput();
    
    重要的是,
    '\n'
    对于
    scanf(“%d”、&number)没有那么特殊。它的作用类似于分隔符,类似于另一个空白或非数字文本


    '\n'
    确实会导致缓冲的
    stdin
    接受用户输入行,以便通过各种
    scanf()
    调用进行处理。

    让我们保持简单。我想你对缓冲区或标准输入法一无所知。 scanf用于从用户获取输入。每当您键入一个数字并按键盘上的“空格”或“回车”键时,该数字就会输入到程序中以供进一步使用。键入scanf(“%d”和&n)时它意味着从用户处获取整数输入,并将其存储在变量n的地址上