如何用scanf输入字符串 空格一个字符后结束输入?

scanf函数怎么结束字符的读取?_百度知道
scanf函数怎么结束字符的读取?
#include &stdio.h&#include&string.h&int main(){ char n[123];printf(&input teh str:&);gets(n);i=strlen(n);printf(&the str long is:%d\n&,i);}简单的方法是:在while循环里价格判断就可以了 while (scanf(&%c&,&n[a])==1&&n[a]!='\n'),输入五个数后就不会一直循环下去了。
其他类似问题
为您推荐:
char n[123]#include &lt.h&gt.h&int main(){ #include&
i=strlen(n);
printf(&quot:%d&#92:&stdio,i););n&
楼上的说的有点繁琐,其实很简单只要在while循环里价格判断就可以了 while (scanf(&%c&,&n[a])==1&&n[a]!='\n'),你再试试输入五个数后就不会一直循环下去了。
,其实很简单只要在while循环里价格判断就可以了 while (scanf(&%c&,&n[a])==1&&n[a]!='\n'),你再试试输入五个数后就不会一直循环下去了。
scanf fscanf 都是按格式串的指示读,提供给他的数据流要按照严格的格式
getc fgetc 这两个功能上没区别,遇到文件尾或出错是返回EOF
gets 是旧的不安全版本,尽量避免使用; fgets 读回一行,遇到EOF或\n结束,有时候会在缓冲区写入\n,但是并不是总如此,在缓冲区最后一个字符后面写入'\0'
getchar getch 前一个需要回车才接受输入,后一个则不需要,而且后一个不会在输出设备显示输入的字符;前一个是&stdio.h&中定义的,后一个则是&conio.h&中定义的。后一个因为不是标准C的,所以不是所有编译器都支持
解释的很详细,但是我还有个问题,就是经过测试:gets会读取\n但是会丢弃\n,而fgets会读取\n,那你为什么会说“并不总是如此”,有什么特例吗?
。。。嗯,如果一旦看到如“不是...
scanf的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁在输入输出字符串时scanf(),printf()和gets(),puts()的区别浅谈
字体:[ ] 类型:转载 时间:
在输入输出字符串时scanf(),printf()和gets(),puts()的区别浅谈,需要的朋友可以参考一下
1.scanf("%s",str)和gets(str)
scanf("%s",str)和gets(str)均可用于输入字符串到字符数组变量str,但scanf("%s",str)只读到输入字符的空格或回车处,而gets(str)读到回车处结束,所以当句子中单词由空格分开时要用后者来输入,如下图所示:
需要强调一点,scanf("%s",str)在遇到'\n'(回车)或' '(空格)时输入结束,但'\n'(回车)或' '(空格)停留在出入缓冲区,如处理不慎会影响下面的输入;gets(str)遇到'\n'(回车)时输入结束,但'\n'(回车)已被替换为'\0',存储于字符串中,输入缓冲中没有遗留的'\n'(回车),不会影响后续的输入。测试程序的代码为:
代码如下:View Code
#include&iostream&#include&stdio.h&
int main(){& //freopen("//home//jack//jack.txt","r",stdin);& char str[80];&& cout&&"1、请输入一个没有空格的字符串:"&&& scanf("%s",str);& cout&&"用scanf(\"%s\",str)输入的字符串为:"&&str&&& cout&&"再输入一次作为对比:"&&& while((ch=getchar())!='\n'&&ch!=EOF);& gets(str);& cout&&"用gets(str)输入的字符串为:"&&str&&& cout&&"2、请输入一个有空格的字符串:"&&& scanf("%s",str);& cout&&"用scanf(\"%s\",str)输入的字符串为:"&&str&&& cout&&"再输入一次作为对比:"&&& while((ch=getchar())!='\n'&&ch!=EOF);& gets(str);& cout&&"用gets(str)输入的字符串为:"&&str&&& return 0;}
其中while((ch=getchar())!='\n'&&ch!=EOF);是处理输入缓存中的遗留的办法;fflush(stdin)方法对某些编译器不适用,不是标准C支持的函数。
2、printf(“%s”,str)和puts(str)
先看如下代码:
代码如下:View Code
#include&iostream&#include&stdio.h&
int main(){& //freopen("//home//jack//jack.txt","r",stdin);& char str1[80]="hello";& cout&&"用printf(\"%s\",str1)输出的字符串为:";& printf("%s",str1);& cout&&"用puts(str1)输出的字符串为: ";& puts(str1);& char str2[80]="hello world";& cout&&"用printf(\"%s\",str2)输出的字符串为: ";& printf("%s",str2);& cout&&"用puts(str2)输出的字符串为: ";& puts(str2);& return 0;}
从运行结果可以看出,printf(“%s”,str)和puts(str)均是输出到'\0'结束,遇到空格不停,但puts(str)会在结尾输出'\n',printf(“%s”,str)不会换行。printf(“%s\n”,str)可以替换puts(str)。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具通过scanf输入字符串
[问题点数:100分,结帖人didijiji]
通过scanf输入字符串
[问题点数:100分,结帖人didijiji]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年2月 C/C++大版内专家分月排行榜第二2013年4月 C/C++大版内专家分月排行榜第二2013年3月 C/C++大版内专家分月排行榜第二2012年12月 C/C++大版内专家分月排行榜第二2012年11月 C/C++大版内专家分月排行榜第二2012年8月 C/C++大版内专家分月排行榜第二
2014年12月 C/C++大版内专家分月排行榜第三2014年5月 C/C++大版内专家分月排行榜第三2014年3月 C/C++大版内专家分月排行榜第三2013年12月 C/C++大版内专家分月排行榜第三2013年10月 C/C++大版内专家分月排行榜第三2013年9月 C/C++大版内专家分月排行榜第三2013年7月 C/C++大版内专家分月排行榜第三2013年5月 C/C++大版内专家分月排行榜第三2013年2月 C/C++大版内专家分月排行榜第三2013年1月 C/C++大版内专家分月排行榜第三2012年9月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。C语言中Printf和Scanf&的使用方法详细
Printf和Scan函数的使用方法
一&printf()函数是格式化输出函数,&一般用于向标准输出设备按规定格式输出&
信息。在编写程序时经常会用到此函数。printf()函数的调用格式为:&
&&&&&&printf("&格式化字符串&",&&参量表&);&
&&&&其中格式化字符串包括两部分内容:&一部分是正常字符,&&这些字符将按原&
样输出;&另一部分是格式化规定字符,&以"%"开始,&后跟一个或几个规定字符,&
用来确定输出内容格式。&
&&&&参量表是需要输出的一系列参数,&其个数必须与格式化字符串所说明的输出&
参数个数一样多,&各参数之间用","分开,&且顺序一一对应,&&否则将会出现意想&
不到的错误。&
&&&&格式化字符串的格式是:
&&&&&&%[标志][输出最小宽度][.精度][长度]格式字符
1.&&&标志:标志字符为-、+、#、空格四种,其意义下表所示:
&&&&&标志&&&&&&&&&&&&&&&意义
&&&&&-&&&&&&&&&&&&&&&&&结果左对齐,右边填空格
&&&&&+&&&&&&&&&&&&&&&&&输出符号(正号或负号)
&&&&&空格&&&&&&&&&&&&&&输出值为正时冠以空格,为负时冠以负号
&&&&&#&&&&&&&&&&&&&&&&&对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f&类当结果有小数&&&&&&&&&&&&&&&&&&&&&&&&时才给出小数点(??????)
#i&nclude
int&a=100;
float&b=123.255;
printf("a=%d&",a);
printf("a=d&",a);
printf("a=%-10d&",a);
printf("a=%+d&",a);
printf("a=%&d&",a);
printf("a=%#o&",a);
printf("a=%#x&",a);
printf("b=%#f&",b);
a=&&&&&&&100
b=123.254997&&(?????)
2.输出最小宽度:用十进制整数来表示输出的最少位数。(至少要输出这么多位!)
&&&&&&&&&&&&&&&若实际位数多于定义的宽度:则按实际位数输出。
&&&&&&&&&&&&&&&若实际位数少于定义的宽度:则右对齐,左边留空。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&有负号,左对齐,右边留空
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&表示宽度的数字以0开始,则右对齐,左边留空。
例2&#i&nclude
int&a=3456;
printf("a==&",a);&&&&//若实际位数多于定义的宽度:则按实际位数输出
printf("a=d&",a);&&&//若实际位数少于定义的宽度:则右对齐,左边留空
printf("a=%-10d&",a);&&//若实际位数少于定义的宽度:有负号,左对齐,右边留空
printf("a=0d&",a);&&//若实际位数少于定义的宽度:表示宽度的数字以0开始,则右对齐,左边留空
printf("a=%-010d&",a);&//左对齐,0无意义。
运行结果:
a=&&&&&&3456
3.精度:精度格式符以“.”开头,后跟十进制整数。意义是:
&&&&如果输出数字,则表示小数的位数;若实际位数大于所定义的精度数,则四舍五入。若不足则补0;
&&&&如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
#i&nclude
printf("%.3f&",12.3456);
printf("%.9f&",12.3456);
printf("%.3s&","abcdefg");
printf("%.9s&","abcdefg");
运行结果:
12.346&&&&&&&&&&//四舍五入到小数点后三位
12.&&&&//不足补0
4.长度:长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出?????
5.Turbo&C2.0提供的格式字符如下:&
━━━━━━━━━━━━━━━━━━━━━━━━━━&
&&&符号&&&&&&&&&&&&&&&&&&作用&
──────────────────────────&
&&&&%c&&&&&&&&&&&&&&单个字符&&
&&&&%d&&&&&&&&&&&&&&十进制有符号整数&
&&&&%e&&&&&&&&&&&&&&以“科学记数法”的形式输出十进制的浮点数&&如2.451e+02
&&&&%f&&&&&&&&&&&&&&输出十进制浮点数,不带域宽时,保留6位小数
&&&&%g&&&&&&&&&&&&&&选用e或f格式中较短的一个输出十进制浮点数,不输出无效零
&&&&%0&&&&&&&&&&&&&&无输出无符号八进制整数
&&&&%p&&&&&&&&&&&&&&指针的值
&&&&%s&&&&&&&&&&&&&&输出字符串
&&&&%u&&&&&&&&&&&&&&输出无符号十进制整数&
&&&&%x,&%X&&&&&&&&&&输出无符号十六进制整数&(不输出前缀Ox)
━━━━━━━━━━━━━━━━━━━━━━━━━━&
2.&一些特殊规定字符&
━━━━━━━━━━━━━━━━━━━━━━━━━━&
&&&&字符&&&&&&&&&&&&&&&&&&&&&&&&&&&作用&
──────────────────────────&
&&&&&&&&&&&&&&&&&&&&&&&&换行&
&&&&&f&&&&&&&&&&&&&&&&&&&清屏并换页&
&&&&&&&&&&&&&&&&&&&&&&&&回车&
&&&&&&&&&&&&&&&&&&&&&&&&Tab符&
&&&&&xhh&&&&&&&&&&&&&&&&&表示一个ASCII码用16进表示,&
&&&&&&&&&&&&&&&&&&&&&&&&&&其中hh是1到2个16进制数&
━━━━━━━━━━━━━━━━━━━━━━━━━━&
使用这些转义字符时不需要加上%,可单独使用!
&&&&由本节所学的printf()函数,&并结合上一节学习的数据类型,&编制下面的程&
序,&以加深对Turbo&C2.0数据类型的了解。&
&&&&&#i&nclude&
&&&&&#i&nclude&
&&&&&int&main()&
&&&&&&&&&&char&c,&s[20],&*p;&
&&&&&&&&&&int&a=1234,&*i;&
&&&&&&&&&&float&f=3.;&
&&&&&&&&&&double&x=0.54321;&
&&&&&&&&&&p="How&do&you&do";&
&&&&&&&&&&strcpy(s,&"Hello,&Comrade");&
&&&&&&&&&&*i=12;&
&&&&&&&&&&c='x41';&
&&&&&&&&&&printf("a=%d&",&a);&&&&&&
&&&&&&&&&&printf("a=m&",&a);&&&&&
&&&&&&&&&&printf("a=d&",&a);&&&&
&&&&&&&&&&printf("a=-&",&a);&&&&&
&&&&&&&&&&printf("*i=M&",&*i);&&&
&&&&&&&&&&printf("*i=%-4d&",&*i);&&
&&&&&&&&&&printf("i=%p&",&i);&&&&&&
&&&&&&&&&&printf("f=%f&",&f);&&&&&&
&&&&&&&&&&printf("f=6.4f&",&f);&&&&
&&&&&&&&&&printf("x=%lf&",&x);&&&&&&&&
&&&&&&&&&&printf("x=.16lf&",&x);&
&&&&&&&&&&printf("c=%c&",&c);&&&&&&
&&&&&&&&&&printf("c=%x&",&c);&&&&&&
&&&&&&&&&&printf("s[]=%s&",&s);&&&&
&&&&&&&&&&printf("s[]=%6.9s&",&s);&
&&&&&&&&&&printf("s=%p&",&s);&&&&&&
&&&&&&&&&&printf("*p=%s&",&p);&&&&&
&&&&&&&&&&printf("p=%p&",&p);&&&&&&
&&&&&&&&&&getch();&
&&&&&&&&&&retunr&0;&
其他需要注意的一些问题:
1.如果用浮点数表示字符或整型量的输出格式,&小数点后的数字代表最大宽度,&
&&&小数点前的数字代表最小宽度。&
&&&例如:&%6.9s&表示显示一个长度不小于6且不大于9的字符串。若大于9,&&则第9个字符以后的内容将被删除。&
2.使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo&C是按从右到左进行的。请看下面两个例子:
&&int&i=8;
&&printf("%d&%d&%d&%d&%d&%d&",++i,--i,i++,i--,-i++,-i--);
&&int&i=8;
&&printf("%d&",++i);
&&printf("%d&",--i);
&&printf("%d&",i++);
&&printf("%d&",i--);
printf("%d&",-i++);
&&printf("%d&",-i--);
运行结果:
这两个程序的区别是用一个printf语句和多个printf&语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在第一例中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。&再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后i再自增1后为8。&再求“--i”项,i先自减1后输出,输出值为7。&最后才求输出表列中的第一项“++i”,此时i自增1后输出8。
但是必须注意,求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果。
补充:最近在调试程序时发现一段代码如下:
&printf(sFormat,"%%0�",THE_NUMBER_LEN);
输出数组后发现sFormat =
d;其中宏THE_NUMBER_LEN定义的为4,发现如果需要通过在printf转化的数组中出现%,那么就使用%%来代替,且后面的所有字符都会直接放入sFormat数组中一直遇到新的%。只有碰到“%+特定字符”,才会把右边对应的变量放入进来。
例如:&printf(sFormat,"ABC%%d%d%%s�bc",THE_NUMBER_LEN,6);输出为ABC�%s6
还有就是发现如果是修改成%0�,输出的字符串就变成&&
�,这样我猜想就是在printf函数时,碰到第一个%0后知道再遇见下一个%前,如果中间没有特定字符d,s,e,f等,通通变成空格,而我在%中间增加两个的非特殊字符后,发现�前面的空格急剧增加,原因就不清楚。故两%之间不能增加其他非特殊字符。
二&Scan函数
&&&&scanf()函数是格式化输入函数,&它从标准输入设备(键盘)&读取输入的信息。&
其调用格式为:&
&&&&&&scanf("&格式化字符串&",&&地址表&);&
&&&&格式化字符串包括以下三类不同的字符;&
&&&&1.&格式化说明符:&格式化说明符与printf()函数中的格式说明符基本相同。&
&&&&2.&空白字符:&空白字符会使scanf()函数在读操作中略去输入中的一个或多&
个空白字符。&
&&&&3.&非空白字符:&一个非空白字符会使scanf()函数在读入时剔除掉与这个非&
空白字符相同的字符。&
&&&&注意:(1)地址表是需要读入的所有变量的地址,&而不是变量本身:
&&&&&&&&&&&&&----如果是一般的变量,通常要在变量名前加上"&";但输出时是用变量名
&&&&&&&&&&&&&----如果是数组,用数组名就代表了该数组的首地址;输出时也是用数组名
&&&&&&&&&&&&&----如果是指针,直接用指针名本身,不要加上“*”;输出时也用该指针即可。
&&&&&&&&&&&&
各个变量的地址之间同","分开。&
&&&&&&&&&&int&i;&
&&&&&&&&&&char&*p,&str[20];&
&&&&&&&&&&scanf("%d",&&i);&
&&&&&&&&&&scanf("%s",&p);&&&&&&&&&&&
&&&&&&&&&&scanf("%s",&str);&
&&&&&&&&&&printf("i=%d&",i);&
&&&&&&&&&&printf("%s&",&p);&&&&&&&&
&&&&&&&&&&printf("%s&",&str);&
&&&&&(2)scanf函数中是否包含空白/非空白字符导致输入格式的不同
&&&&&&&&&&如:scanf("%d,%d",&i,&j);&&&scanf中有,所以输入的格式应该是5,6==&i=5,j=6
&&&&&&&&&&&&&&scanf("%d%d",&i,&j);&&&&可以用空格或回车来分隔两个输入&如&5&6==&i=5,j=6
&&&&&&&&&&&&&&scanf("%d&&%d",&i,&j);&&同上
&&&&&(3)&实际使用scanf()函数时存在一个问题,&下面举例进行说明:&
&&&&当使用多个scanf()函数连续给多个字符变量输入时,&例如:&
&&&&&main()&
&&&&&&&&&&char&c1,&c2;&
&&&&&&&&&&scanf("%c",&&c1);&
&&&&&&&&&&scanf("%c",&&c2);&
&&&&&&&&&&printf("c1&is&%c,&c2&is&%c",&c21,&c2);&
运行该程序,&输入一个字符A后回车&(要完成输入必须回车),&在执行scanf&
("%c",&&c1)时,&给变量c1赋值"A",&但回车符仍然留在缓冲区内,&执行输入语句&
scanf("%c",&&c2)时,&变量c2输出的是一空行,&如果输入AB后回车,&那么输出结&
果为:&c1&is&A,&c2&is&B。&
&&&&要解决以上问题,&可以在输入函数前加入清除函数fflush()(&这个函数的使&
用方法将在本节最后讲述)。修改以上程序变成:&
&&&&&#i&nclude&
&&&&&main()&
&&&&&&&&&&char&c1,&c2;&
&&&&&&&&&&scanf("%c",&&c1);&
&&&&&&&&&&fflush(stdin);&
&&&&&&&&&&scanf("%c",&&c2);&
&&&&&&&&&&printf("c1&is&%c,&c2&is&%c",&c1,&c2);&
在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
例如:scanf("%c%c%c",&a,&b,&c);
输入为:d&&&e&&&f
则把'd'赋予a,&'&'&赋予b,'e'赋予c。
只有当输入为:&def
时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
如果在格式控制中加入空格作为间隔,
如:scanf&("%c&%c&%c",&a,&b,&c);
则输入时各数据之间可加空格。
&&char&a,b;
&&printf("input&character&a,b&");
&&scanf("%c%c",&a,&b);
&&printf("%c%c&",a,b);
由于scanf函数"%c%c"中没有空格,输入M&&N,结果输出只有M。而输入改为MN时则可输出MN两字符。
(4)格式字符串的一般形式为:
[输入数据宽度][长度]类型
其中有方括号[]的项为任选项。各项的意义如下:
1)类型:表示输入数据的类型,其格式符和意义如下表所示。
&&&格式&&&&&&&&&字符意义
&&&d&&输入十进制整数
&&&o&&输入八进制整数
&&&x&&输入十六进制整数
&&&u&&输入无符号十进制整数
&&&f或e&&&&&&&&&输入实型数(用小数形式或指数形式)
&&&c&&输入单个字符
&&&s&&输入字符串
2)“*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。
&&&&如:scanf("%d&%*d&%d",&a,&b);
当输入为:1&&&2&&&3时,把1赋予a,2被跳过,3赋予b。
3)宽度:用十进制整数指定输入的宽度(即字符数)。
&&&&scanf("]",&a);
只把12345赋予变量a,其余部分被截去。
又如:scanf("MM",&a,&b);
将把1234赋予a,而把5678赋予b。
scanf("MM",&a,&b);
printf("a=%d,b=%d",a,b);
输入&12345&67890
运行结果&a=1234,b=5
4)&长度:长度格式符为l和h,l表示输入长整型数据(如%ld)&和双精度浮点数(如%lf)。h表示输入短整型数据。
使用scanf函数还必须注意以下几点:
1)scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。
2)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 scanf s输入字符串 的文章

 

随机推荐