理解scanf行为
我对C编程非常陌生。我的长官给了这个代码,以找到n个数字的最大值。当我按照先生说的做的时候,事情是完美的,也就是说,当行输入数字时写一个数字,当数字弹出时,像7 8 9 10那样写一行数字理解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) {
#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的地址上