C中用scanf()时应注意的一些问题
Posted 路人姜。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C中用scanf()时应注意的一些问题相关的知识,希望对你有一定的参考价值。
最近在做题时遇到了scanf()的一些问题,下面说一下,scanf()中一些需要注意的地方:
先说一下scanf()的格式:
scanf(“格式控制字符串”, 地址表列);
0、格式字符串一般形式如下:
%[*][输入数据宽度][长度]类型
其中有方括号[]的项为任选项,举个*的栗子:
#include <stdio.h> int main() { int a,c; scanf("%3d%*d%d",&a,&c);//第二个%d被略过了 printf("%d\\n%d",a,c); return 0; }
1、scanf函数中没有精度控制,而printf()可以,如下:
#include <stdio.h> int main() { float a; // scanf("%3.2f",&a); 错误写法 scanf("%f",&a); printf("%3.2f",a); return 0; }
2、在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束,如下:
#include <stdio.h> int main() { int a; scanf("%d",&a); printf("%d",a); return 0; }
其中数据结束在d,所以输出123
3、在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符,如下:
#include <stdio.h> int main() { char a,b,c; scanf("%c%c%c",&a,&b,&c); printf("%c%c%c",a,b,c); return 0; }
其中a为d,b为空格,c为e
4、若想在输入字符时用空格隔开则这样写:
#include <stdio.h> int main() { char a,b,c; scanf("%c %c %c",&a,&b,&c);//之间加上空格 printf("%c%c%c",a,b,c); return 0; }
注:如果输入的是整形等非字符型数据,根据2、可知道不须这么写,因为空格会被视为非格式串。
5、scanf()中%s和%c的区别:
首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf,getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取)。另外特别注意键盘上敲入回车实际为“\\r\\n”,但存储到缓冲区时候会舍弃‘\\r’而只存储\\n.例如我们敲入字符“12345回车”,缓冲区内存储的为“12345\\n”。
①对于scanf以%s格式输入时候,“空格、换行符、TAB”等是作为两个数据的分隔符存在的,即分隔符前后是两个数据,读入时候分隔符不读入。
②对于scanf以%c格式输入时候,“空格、换行符、TAB”等是正常字符。
举个栗子:
#include <stdio.h> int main() { char c; char a[10]; scanf("%s",a); scanf("%c",&c); printf("%s",a); printf("%c****",c); return 0; }
“adc”存进了字符数组a,%s视空格为分隔符,但是空格存进了缓冲区,%c视空格为正常字符读进了c。
再来个栗子:
若让你输入如下所示n行n列的字符如:
abc
def
ghi
则应用%s,而不是%c,代码如下
#include <stdio.h> int main() { int i,j; char a[3][3]; for(i=0;i<3;i++){ scanf("%s",a[i]); } for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("%c",a[i][j]); } } return 0; }
本文参考自http://c.biancheng.net/cpp/html/34.html
以上是关于C中用scanf()时应注意的一些问题的主要内容,如果未能解决你的问题,请参考以下文章
c语言中用了scanf语句就输不出结果把scanf删掉就能出结果是为什么