C语言:关于scanf函数输入问题 C语言基本问题 关于scanf函数输入的问题 假设语句:sc...

\u5173\u4e8eC\u8bed\u8a00\u4e2d\u7528scanf\u51fd\u6570\u5982\u4f55\u8f93\u5165\u6570\u636e\u7684\u95ee\u9898

\u5982\u679cscanf\u4e2d%d\u662f\u8fde\u7740\u5199\u7684\u5982\u201c%d%d%d\u201d,\u5728\u8f93\u5165\u6570\u636e\u65f6\uff0c\u6570\u636e\u4e4b\u95f4\u4e0d\u53ef\u4ee5\u52a0\u9017\u53f7\uff0c\u53ea\u80fd\u662f\u7a7a\u683c\u6216tab\u952e\u6216\u8005\u56de\u8f66\u952e\u2014\u2014\u201c2 3 4\u201d
\u201c2\uff08\u6309tab\uff093\uff08\u6309tab\uff094\uff08\u6309tab\uff09\u201d\u3002
\u82e5\u662f\u201c%d\uff0c%d\uff0c%d\u201d\uff0c\u5219\u5728\u8f93\u5165\u6570\u636e\u65f6\u9700\u8981\u52a0\u201c\uff0c\u201d\u2014\u2014\u201c2\uff0c3\uff0c4\u201d.
\u5728\u8f93\u5165\u591a\u4e2a\u6570\u503c\u6570\u636e\u65f6\uff0c\u82e5\u683c\u5f0f\u63a7\u5236\u4e32\u4e2d\u6ca1\u6709\u975e\u683c\u5f0f\u5b57\u7b26\u4f5c\u8f93\u5165\u6570\u636e\u4e4b\u95f4\u7684\u95f4\u9694,\u5219\u53ef\u7528\u7a7a\u683c\uff0cTAB\u6216\u56de\u8f66\u4f5c\u95f4\u9694\u3002 C\u7f16\u8bd1\u5728\u78b0\u5230\u7a7a\u683c\uff0cTAB\uff0c\u56de\u8f66\u6216\u975e\u6cd5\u6570\u636e(\u5982\u5bf9\u201c%d\u201d\u8f93\u5165\u201c12A\u201d\u65f6\uff0cA\u5373\u4e3a\u975e\u6cd5\u6570\u636e)\u65f6\u5373\u8ba4\u4e3a\u8be5\u6570\u636e\u7ed3\u675f\u3002

\u5e72\u5417\u4e0d\u7528%s %s %s \uff0c\u8fd9\u683712 23 84 \u5c31\u53ef\u4ee5\u6b63\u5e38\u8d4b\u503c\u4e86\u3002\u5426\u5219\u4f60\u90a3\u4e2a%c\u6700\u591a\u8bfb\u4e00\u4e2a\u5b57\u7b26

你首先要明白,从键盘读入键盘缓冲区(buffer)的数据都是以ASCII码存储的(包括回车)。
程序1
#include "stdio.h"

void main()
{
char a;
char b;
scanf("%d",&a);
scanf("%d",&b);
printf("%d %d",a,b);
}

键盘输入
97<回车>
第一次回车后,buffer中的ASCII:39h,37h,0AH(0A是换行的ASCII), scanf会根据格式字符串中的第一个%d对buffer按字节顺序读取,当读取到0A时,认为%d型的数据结束,此时把已经读取到的39h,37h依据%d转为整型数据97存储在字符型变量a中。(这里是除去了扫描截止点0AH)
此时buffer中已经无任何数据了。

96<回车>
第二次回车后,按同样的流程,scanf会根据格式字符串中的第二个%d对buffer按字节顺序读取。最终b得到96.
此时buffer中已经无任何数据了。
输出
97 96

程序2
#include "stdio.h"

void main()
{
char a;
char b;
scanf("%c",&a);
scanf("%c",&b);
printf("%d %d",a,b);
}

键盘输入
9<回车>buffer:39H,0AH
因为scanf会按照第一个%c格式扫描buffer(只扫描一个字节就结束),然后把扫描到的39H直接送到变量a(当以%d格式读出来时,39H就是57)
此时,buffer中只有:0AH。
然后,scanft又遇到第二个%c,继续扫描buffer,得到0aH并送入变量b.
此时buffer中已经无任何数据了

输出
57 10

程序3
#include "stdio.h"

void main()
{
char a[100];
char b[100];
scanf("%s",a);
scanf("%s",b);
printf("%s %s",a,b);
}

键盘输入
abc<回车>
第一次回车后,buffer:61H,62H,63H,0AH。
scanf会按照%s的格式对buffer按字节顺序扫描,当扫描到0AH时,结束扫描(按照%s的要求,空格20H也是扫描结束点)。
然后把扫描到的(除去最后一个判断扫描截至的字节0AH)数据直接送入以a为起始地址的字符串。
此时,buffer无任何数据了。

def<回车>
第二次回车后,buffer:65H,66H,67H,0AH.扫描的流程与上面的完全一致。
输出
abc def

程序4
#include <stdio.h>
void main()
{
int i;
char j;
for(i=0;i<2;i++)
scanf("%c",&j);/*注意这里%前没有空格*/
printf("%d",j);
}

键盘输入
1<回车>,
这里scanf执行了两次(i==0时,与i==1时),而且每次都是想对j赋值。
第一次scanf,按%c的要求,只扫描buffer中的一个字节,但是buffer中并不数据,于是要求键盘输入数据到buffer,此时的1<回车>代表向buffer中输入了:31H,0AH。
然后按%c的要求,只扫描buffer中的一个字节:31h,并将它直接送入变量j.
此时,buffer中还留下:0AH。

第二次scanf要求键盘输入数据,按%c的要求,只扫描buffer中的一个字节:0Ah,并将它直接送入变量j.
此时,buffer无数据了。

最后,你用%d格式输出j的值(0AH换成整型就是10)

输出
10

程序5
#include <stdio.h>
void main()
{
int i;
char j;
for(i=0;i<2;i++)
scanf(" %c",&j);/*注意这里%前有一个空格*/
printf("%d",j);
}
1<回车>2<enter>的情况:
scanf会按照格式控制字符串的要求,顺序扫描buffer.
但是你其中有一个空格,这个很特殊,我也是第一次发现这个问题(一般我都不会在scanf中加入任何常量字符)

我测试了一下:我发现这个空格有吸收回车(0AH)和空格(20H)的“神奇功效”,吸收之后再要求buffer给一个字节,直到这个字节不是0AH或者 20H,此时把这个字节交给下一个格式字串。

第一次循环时遇到格式字串空格,就扫描buffer中的一个字节,但是buffer中无数据,要求从键盘输入数据:1〈回车〉,buffer中有数据了——31H,0AH。再读取到字节31H,scanf发现这个并不是0AH/20H,就把这个字节31H交给格式字符%c处理。
循环结束,此时buffer里面还有:0AH.

第二次循环时遇到格式字串空格,就扫描buffer中的一个字节——0AH,发现是0AH/20H,于是就要求buffer再来一个字节。此时buffer里面已经没有数据了,要求键盘输入:2<enter>.
buffer中有数据了——32H,0AH。于是再读一个字节31H,scanf发现这个并不是0AH/20H,就把这个字节32H交给格式字符%c处理(j最终得到32H)。
循环结束,此时buffer里面还有:0AH.

这里有一篇关于Printf的帖子:

程序6
#include "stdio.h"

void main()
{
int a;
int b;
scanf("%c",&a);
scanf("%c",&b);
printf("%d %d",a,b);
}

键盘输入
1<回车>

问题5:

你的编译器VC认为%d数据应该是4个字节,但是你采用的是%c读数据,
scanf("%c",&a);此句读到的是1的ascii码:31h.然后把31H直接送入地址&a(而并没有改写a的三个高字节地址)。
scanf("%c",&b);同理。
你可以用printf("a=%x,b=%x\n",a,b);来验证我说的。它们的最低字节肯定是31H,0AH。

PS1:
当你把 int a;int b;放在main()外进行定义时,a,b的初值就是0。此时你会得到正确的结果。
当你把 int a;int b;放在main()内进行定义时,a,b不会被初始化(它们的三个三个高字节地址的内容是不确定的),你就会得到上面错误的结果。(定义的动态变量都不会被初始化,静态变量会被初始化为0)

PS2:以下也是不正确的用法。
char c;
scanf("%d",&c);/当你用%d给c赋值时,会对从&c开始的连续4个字节进行赋值。当从buffer得到的值是在一个字节范围内(-128~127),下面是可以正常输出的。但是不管怎样,这样做是很危险的——越界。
printf("%d",c);
=================请你测试下这个程序========================
#include "stdio.h"
void main()
{
char c[4],i=4;
scanf("%d",c);/*请输入258<回车>*/

while(i-->0)
printf("%02x ",c[i]);
printf("\n");
}/*如果得到的结果是00 00 00 01 02就说明我的结论是正确的(258的转为16进制数就是00 00 01 02H,然后scanf会把这个数放入以c为起始地址的)

================以下程序也是======================
#include "stdio.h"
void main()
{
char c,i=4;
char *p=&c;
scanf("%d",&c);/*请输入258<回车>*/

while(i-->0)
printf("%02x ",p[i]);
printf("\n");
}

如果前面引号里的格式控制符间用的是什么符号,那么你输入的时候也要用同样的符号来分割,例如scangf("%d,%d",&a,&b);那么你输入a,b的时候要用“,”来分割,否则编译错误或者得不到正确答案。如果不加任何符号的话,就默认是空格或者 Tab,回车也可以的。

scanf函数在输入 字符串 时遇空格,制表符就停止

1.这个要看你的程序怎么写的同时需要什么样的数据类型。
2.对,编译器的确能自动识别数据类型,所以当你要输入的全是数字型时,遇到空格,回车就自 动结束了,开始下一个数的输入。但当你要输入字符或者字串是就需要用程序控制了,否则空格会被当做是一个字符写入。
3.上面2已经回答了。
你这个正确的写法是(都用空格表示结束标志)
输入字符时加空格(在第一个%c的两边)表示结束标志,本来其他也要加空格表示结束,但因为都是数字型,输入空格时编译器就当做结束标志了。

  • c璇█涓scanf鍑芥暟鐨勭敤娉曟湁鍑犵?
    绛旓細閫夋嫨绛旀A锛屽洜涓洪鐩腑鐨凙閫夐」鈥渁bc鈥濇槸涓涓瓧绗︿覆鎵浠ヨA閫夐」涓嶈兘澶熸纭殑璧嬪肩粰x鍙橀噺銆傛墍浠ラ鐩殑绛旀閫夋嫨鐨勬槸A閫夐」銆傞夐」瑙f瀽锛欱閫夐」铏界劧鏄竴涓暣褰㈢殑鏁帮紝浣嗘槸鍙互璧嬪肩粰x鍙橀噺锛屽彂鐢熶簡鏁版嵁绫诲瀷鐨勮浆鎹紝C閫夐」杈撳叆鐨勬槸涓涓瓧绗︼紝閭d箞瀛楃鏈変竴涓狝SCII鐮佸硷紝鐩稿綋浜庡皢鈥楢鈥欑殑ASCII鐮佸艰祴鍊肩粰x鍙橀噺銆侰...
  • C璇█涓scanf鍑芥暟鐨杈撳叆鏍煎紡
    绛旓細scanf鍑芥暟鏄c璇█涓杈撳叆鍑芥暟鐨勪竴绉嶏紝灏嗙敤鎴蜂粠閿洏杈撳叆鐨勬枃鏈浆鎹负瀵瑰簲鐨勫煎瓨鍌ㄨ捣鏉ワ紝涓嬮潰璇风湅璇︾粏鐨勬暀绋嬨1銆侀鍏堝湪涓诲嚱鏁颁腑瀹氫箟涓涓彉閲廰ge锛岀被鍨嬩负int绫诲瀷銆2銆佹帴鐫鐢╬rintf鍑芥暟缁欏嚭鐩稿簲鐨勬彁绀衡斺減lease enter your age鈥濄3銆佷娇鐢╯canf鍑芥暟锛屽皢鐢ㄦ埛杈撳叆鐨勫唴瀹瑰瓨鍌ㄥ埌age杩欎釜鍙橀噺锛屾敞鎰忓湪鍙橀噺瑕佸姞涓&...
  • C璇█涓scanf鏄粈涔堟剰鎬?
    绛旓細C璇█涓璼canf鏄爣鍑嗗簱鍑芥暟锛屼富瑕佺敤鏉ユ帴鏀剁敤鎴疯緭鍏ョ殑鏁版嵁銆俿canf涓巔rintf鍑芥暟涓鏍凤紝閮借瀹氫箟鍦ㄥご鏂囦欢stdio.h閲岋紝鍥犳鍦ㄤ娇鐢scanf鍑芥暟鏃惰鍔犱笂#include <stdio.h>銆傚畠鏄牸寮杈撳叆鍑芥暟锛屽嵆鎸夌敤鎴锋寚瀹氱殑鏍煎紡浠庨敭鐩樹笂鎶婃暟鎹緭鍏ュ埌鎸囧畾鐨勫彉閲忎箣涓傚嚱鏁版牸寮忥細int scanf(char *format, args, ...);鍔 鑳...
  • c璇█涓scanf鏄粈涔堟剰鎬(scanf浠涔堟椂鍊欑敤c璇█)
    绛旓細scanf鍦c璇█涓殑浣滅敤 scanf()鏄C璇█涓殑涓涓杈撳叆鍑芥暟銆備笌printf鍑芥暟涓鏍凤紝閮借澹版槑鍦ㄥご鏂囦欢stdio.h閲岋紝鍥犳鍦ㄤ娇鐢scanf鍑芥暟鏃惰鍔犱笂#include銆傦紙鍦ㄦ湁涓浜涘疄鐜颁腑锛宲rintf鍑芥暟涓巗canf鍑芥暟鍦ㄤ娇鐢ㄦ椂鍙互涓嶄娇鐢ㄩ缂栬瘧鍛戒护#include銆傦級瀹冩槸鏍煎紡杈撳叆鍑芥暟锛屽嵆鎸夌敤鎴锋寚瀹氱殑鏍煎紡浠庨敭鐩樹笂鎶婃暟鎹緭鍏ュ埌鎸囧畾鐨勫彉閲忎箣...
  • C璇█涓殑scanf鍑芥暟涓殑杈撳叆
    绛旓細include<studio.h> void main(){ int a,b;float x,y;char c1,c2;scanf("%d,%d",&a,&b);scanf("%f,%f",&x,&y);scanf("%c,%c",&c1,&c2);printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n",a,b,x,y,c1,c2);} 杩欐牱灏卞彲浠ヤ簡~~...
  • C璇█:鍏充簬scanf鍑芥暟杈撳叆闂
    绛旓細绗簩娆″洖杞﹀悗锛屾寜鍚屾牱鐨勬祦绋嬶紝scanf浼氭牴鎹牸寮忓瓧绗︿覆涓殑绗簩涓%d瀵筨uffer鎸夊瓧鑺傞『搴忚鍙栥傛渶缁坆寰楀埌96.姝ゆ椂buffer涓凡缁忔棤浠讳綍鏁版嵁浜嗐傝緭鍑 97 96 绋嬪簭2 include "stdio.h"void main(){ char a;char b;scanf("%c",&a);scanf("%c",&b);printf("%d %d",a,b);} 閿洏杈撳叆 9<鍥炶溅>...
  • C璇█涓敤scanf鍑芥暟杈撳叆瀛楃鏃,涓轰粈涔堣鍦ㄨ緭鍏ユ帶鍒剁%c鍓嶉潰鍔犵┖鏍?鐢╯...
    绛旓細c鍓嶉潰鐨勭┖鏍煎氨鏄敤鏉ュ睆钄界┖鐧界鐨勶紝棣栧厛蹇呴』瑕佺煡閬C璇█ scanf() 鍑芥暟鐨勭壒鎬э紝浠ュ強scanf()涓庣紦鍐插尯銆佹爣鍑杈撳叆娴佷箣闂寸殑鑱旂郴銆傚湪姝や箣鍓嶏紝鍏堜粙缁嶄袱涓笓涓氭湳璇1.缂撳啿鍖 缂撳啿鍖烘槸涓鍧楀瓨鏀句复鏃惰緭鍏ユ暟鎹殑鍐呭瓨锛屾垜浠湪閿洏涓婅緭鍏ユ暟鎹箣鎵浠ヤ笉浼氶┈涓婃樉绀猴紝灏辨槸鍥犱负鏁版嵁瀛樻斁鍦ㄤ簡缂撳啿鍖猴紝鍦ㄤ笂闈緥瀛愪腑锛屽綋鎴戜滑鎸...
  • c璇█涓scanf鏄暐鎰忔漵canf鍦╟璇█涓粈涔堟剰鎬
    绛旓細鍏充簬c璇█涓璼canf鏄暐鎰忔濓紝scanf鍦╟璇█涓粈涔堟剰鎬濊繖涓緢澶氫汉杩樹笉鐭ラ亾锛屼粖澶╂潵涓哄ぇ瀹惰В绛斾互涓婄殑闂锛岀幇鍦ㄨ鎴戜滑涓璧锋潵鐪嬬湅鍚э紒1銆乻canf()鏄C璇█涓殑涓涓杈撳叆鍑芥暟銆2銆佷笌printf鍑芥暟涓鏍凤紝閮借澹版槑鍦ㄥご鏂囦欢stdio.h閲岋紝鍥犳鍦ㄤ娇鐢scanf鍑芥暟鏃惰鍔犱笂#include 銆3銆侊紙鍦ㄦ湁涓浜涘疄鐜颁腑锛宲rintf鍑芥暟涓巗canf...
  • 扩展阅读:c语言scanf用法举例 ... 5个例子搞懂scanf ... c语言输入单个字符scanf ... printf和scanf的标准举例 ... 用下面的scanf函数输入 ... c语言scanf为什么要&符号 ... c语言scanf怎么老是报错 ... c语言多个scanf用法 ... c语言中scanf的用法及规则 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网