首页 > 编程知识 正文

whilescanf语句,c语言whilescanf有什么用

时间:2023-05-04 06:09:39 阅读:258851 作者:4782

scanf 函数是有返回值的,它的返回值可以分成三种情况 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &i, &j);

如果用户输入"1 2",可以正确输入,返回2(正确输入了两个变量);
如果用户输入"1,1",可以正确输入i,无法输入j,返回1(正确输入了一个变量)。

0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。leetcode中常用的scanf用法

##算法题目中经常会用到几个while语句,能够同时输入和判断,比较好用

1、while(scanf("%d",&n),n)
功能:当n为0时中止循环

这里要先说一下逗号表达式:逗号表达式的值是逗号后面的那个数。例如x=(5,6),则x=6。

while(scanf("%d",&n),n)括号里的语句其实就是个逗号表达式,它的返回值是n的值,所以这个语句就相当于while(n),n=0时跳出循环,写成这样是为了输入。

如果是while(scanf("%d%d",&n,&m,),n,m),那么就相当于while(m)。

2、while(scanf("%d",&n)!=EOF)和while(~scanf("%d",&n))
功能:当读到文件结尾时中止循环

scanf语句的返回值为成功赋值的个数,例如scanf("%d %d",&a,&b),如果a、b均赋值成功返回值为2,只是a赋值成功返回1,a、b都不成功返回0,出错的时候返回EOF。

~是按位取反,scanf语句如果没有输入值就是返回-1,按位取反结果为0。

注意:这两种方法在输入字母的时候会变成死循环,而scanf("%d %d",&a,&b)==2不会。windows下可通过按“Ctrl +Z”、linux下可通过“Ctrl + D”来来达到“输入”文件结束符的效果,结束循环。

3、while(scanf("%d",&n)==1)
功能:赋值失败,跳出循环

这个应该很好理解了吧,如果是scanf("%d%d",&n,&m就是while(scanf("%d %d",&a,&b)==2)。

 

利用格式符“%[]”它的作用为扫描字符集合

Scanf(“%[^c]”,str);

其中“c”是一个具体的字符常量(包括控制字符)。

C语言中scanf()函数提供的“%[]”格式串可以用来进行多个字符的输入,并对结束符进行自定义。 对于%[]还可以用^+任意字符(包括 eof)来结束字符串的输入,

如%[^EOF]就是直到有EOF 输入,字符串才中止。

scanf(“%[^n]”,str); //以换行符作为字符串输入的结束

一scanf函数输入格式中的字符串.

    scanf函数输入格式中也可以含有普通字符串, 但他的含义是这些字符必须在输入中出现

,例如: int num;

          Scanf("hello %d", & num);

 

   他的含义是首先要求输入一个hello字符串,然后再输入一个十进制数. 注意在等待输入时忽略hello与要输入的数之间的空格,制表符,回车.因此这两种输入都是正确的:

          hello 1234

          hello1234

 

三.scanf函数中一个参数的应用.

   在scanf函数中,我们可以使用 %c来读取一个字符,使用 %s 读取一个字符串. 但是读取字符串时不忽略空格,读字符串时忽略开始的空格,并且读到空格为止,因此我们只能读取一个单词,而不是整行字符串.因此一般使用fgets来读取一个字符串.

其实scanf函数也可完成这样的功能,而且还更强大.

 

   这里主要介绍一个参数,%[ ] ,这个参数的意义是读入一个字符集合. [ ]是个集合的标

志,因此%[ ]特指读入此集合所限定的那些字符, 比如 %[A-Z] 是输入大写字母,一旦遇到不在

此集合的字符便停止. 如果集合的第一个字符是" ^ ", 这说明读取不在" ^ " 后面集合的字

符,既遇到" ^ " 后面集合的字符便停止.注意此时读入的字符串是可以含有空格的.

 

  Eg.  输入一个字符串, 这个字符串只含有小写字符.遇到第一个不是小写字符时停止.

 scanf("%[a-z],str);

scanf("%[^9]", string);

 

  Eg.  想输入一个字符串, 遇到 "." 停止,可设计如下:

     scanf("%[^.]", str);

 

scanf() 怎样读取输入? 
scanf() 开始读取输入以后,会在遇到的第一个空白字符空格(blank)、制表符(tab)或者换行符(newline)处停止读取。

假定使用了一个%d说明符来读取一个整数。scanf() 函数开始每次读取一个输入字符,它跳过空白字符(空格、制表符和换行符)直到遇到一个非空白字符。因为它试图读取一个整数,所以scanf() 期望发现一个数字字符或者一个符号(+或者-)。如果它发现了一个数字或一个符号,那么它就保存之并读取下一个字符;如果接下来的字符是一个数字,它保存这个数字,并读取下一个字符。就这样,scanf() 持续读取和保存字符直到它遇到一个非数字的字符。如果遇到了一个非数字的字符,它就得出结论:已经到了整数的尾部。scanf()把这个非数字字符放回输入。这就意味着当程序下一次开始读取输入时,它将从前面被放弃的那个非数字字符开始。最后,scanf() 计算它读取到的数字的相应数值,并将该值放到指定的变量中。 
如果使用了字段宽度,那么scanf() 在字段结尾或者在第一个空白字符处(而这中最先到达的一个)终止。 
如果第一个非空白字符不是数字,将会发生什么呢?比如说,是A而非一个数字?这时scanf() 会停在那里,并把A(或者不管是什么)放回输入。没有把任何值赋给指定的变量,程序下一次读取输入时,它就在A处重新开始。如果程序中只有%d说明符,scanf() 永远也不会越过那个A(去读下一个)。而且,如果使用带有多个说明符的scanf()语句,ANSI C要求函数在第一个出错的地方停止读取输入。 
使用其他数字说明符读取输入与使用%d的情况相同。主要的区别在于scanf()也许会把更多的字符看作数字的一部分。例如,%x说明符要求scanf()识别十六进制数字a到f和A到F。浮点说明符要求scanf() 识别小数点、指数记数法(e-notation)、新的p记数法(p-notation)。 
如果使用%s说明符,那么空白字符以外的所有字符都是可以接受的,所以scanf() 跳过空白字符直到遇到第一个非空白字符,然后保存再次遇到空白字符之前的所有非空白字符。这就意味着%s使scanf() 读取一个单词,也就是说,一个不包含空白字符的字符串。如果使用字段宽度,scanf() 在字段的结尾或者第一个空白字符处停止。不能通过字段宽度使得scanf() 用一个%s说明符读取多于一个字的输入。最后一点:当scanf() 把字符串放在一个指定的数组中时,它添加终止的’’使得数组内容成为一个C字符串。 
如果使用%c说明符,那么所有的输入字符都是平等的。如果下一个输入字符是一个空格或者换行符,将会把这个空格或换行符赋给指定的变量;不会跳过空白字符。 
scanf() 函数允许把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要与输入字符串准确匹配。格式字符串中的空格意味着跳过下一个输入项之前的任何空格。(“任何空格”的概念包括没有空格的特殊情况) 
除了%c以外的说明符会自动跳过输入项之前的空格,所以scanf(“%d%d”, &n, &m) 与scanf(“%d %d”, &n, &m) 的行为是相同的。对于%c来说,向格式字符串中添加一个空格将导致一些区别。例如:如果在格式字符传中%c之前有一个空格,那么scanf() 会调到第一个非空白字符处。也就是说,命令scanf(“%c”, &ch) 读取在输入中遇到的第一个字符,而scanf(“ %c”, &ch) 则读取遇到的第一个非空白字符。 
 

参考:

https://blog.csdn.net/xiancaifu/article/details/6076289

https://blog.csdn.net/chuhe163/article/details/81048751

https://blog.csdn.net/u012804524/article/details/50639007

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。