《C语言解惑》—— 2.3 输入的格式配对错误

2.3 输入的格式配对错误

【例2.3】下面的程序不能正常运行,是何原因?

#include <stdio.h>
void main( )
{
      double x,y;
      printf( "输入x和y的值:");
      scanf( "%f%f",&x,&y);
      printf( "%g+%g=%g\n",x,y,x+y);
}

运行示范如下。
输入x和y的值:2.1 3.4
-9.25596e+061+-9.25596e+061=-1.85119e+062
有人可能认为是printf语句的问题,其实不是,g格式符用来输出实数,它根据数值的大小自动选f格式或e格式。输出double(包括long double)格式的数据不需要使用lf,所以这个格式是正确的。
经过分析,只能认为是scanf的格式不对了。f是输入实数(浮点数),输入数据可以用小数形式或指数形式。e与f作用相同并可以互相替换,所以只能去看lf格式了。
“l”格式用于输入长整型数据,说明相应的参数是long型,而不是int型。读入float数据时,说明相应的参数应是double型。由此可以得出结论:是格式不匹配造成的错误,应将格式符改为“lf”或者将声明改为“float”型。将scanf语句改为
scanf("%lf%lf",&x,&y);
则得到正确的演示输出结果为“2.1+3.4=5.5”。这种改动对将声明改为
long double x,y;
也是正确的。如果不改变scanf语句,可以将声明改为
float x,y;
需要注意的是,这时scanf虽然不能使用“lf”格式,但可以使用e格式,即
scanf("%e%e",&x,&y);
当然,这种情况也支持g格式,即
scanf("%g%g",&x,&y);

意 它们只对float声明的变量有效,对使用double格式声明的变量无效。

【例2.4】下面程序错在哪里?分析分别输入123456789和123 456 789时的输出结果。

#include <stdio.h>
void main( )
{
    int a=9,b=5,c=0;
    char c='A';
    printf("输入:");
    scanf("%2d%*3d%d%c",&a,&b,&c);
    printf("输出:a=%g,b=%g,c=%c\n",a,b,c);
}

错在混淆了整数和浮点数的格式,g对整数无效。应该改为
printf("输出:a=%d,b=%d,c=%c\n",a,b,c);
输入语句中的“”号表示本输入项在读入数据后不赋给相应的变量。%2d用来指定数据位数的宽度为2。如输入123456789,则对应于%2d的格式是把数据前面的12存入变量a中;%3d 表示输入3位数,但不赋给任何变量,即不使用数据345;后面的格式是%d,它没有数字域,所以将6789赋给b。因为后面是换行符,所以c存入的是换行符。如果c是使用%d输出,则输出“c=10”。但这里是使用%c,换行符不是可显示字符,所以运行结果为
输入:123456789
输出:a=12,b=6789,c=
需要注意的是,如将这条语句改为
scanf("%2d%*3d%1d%c",&a,&b,&c);
则输出演示的结果为
输出:a=12,b=6,c=7
虽然%1d是使b只取1位数字(即数字6),但b不用的数据(789)仍然能供后面使用。因为这是一组输入,%*只是修饰舍掉的位数,后面的%1d格式是取舍给变量的格式,剩下数据789,c是单字符型而不是字符串,所以只能取数据7。
回到原来的程序,当输入123 456 789时,结果又不一样。它将12赋给a,丢弃3,但3之后是空格,编译系统认为这个字符串已经结束,就把下面的字符串456赋给b,虽然有789的输入,但它们与456之间有一个空格,所以是用这个空格为c赋值,输出演示的结果为
输入:123 456 789
输出:a=12,b=456,c=
被舍弃的字符串是以空格区分的,如果数量不够,也只舍弃到空格为止。如果数量足够,则取舍到规定数量,将剩下的赋给变量。例如:
输入:1 2 3456 789
输出:a=1,b=3456,c=
输入:1 23456 789
输出:a=1,b=56,c=
如果用%d输出c,则c=32。如果想让789赋给c,则要将c定义为字符串。
【例2.5】使用字符串的例子。

#include <stdio.h>
void main( )
{
     int a=9,b=5; char c[4];
     printf("输入:");
     scanf("%2d%*3d%d%s",&a,&b,&c);
     printf("输出:a=%d,b=%d,c=%s\n",a,b,c);
}

运行实例如下。
输入:123 456 789
输出:a=12,b=456,c=789

时间: 2024-12-03 19:34:20

《C语言解惑》—— 2.3 输入的格式配对错误的相关文章

《C语言解惑》—— 导读

前 言 C语言编程仍然是编程工作者必备的技能.目前有四类典型的学习C语言的教材:第一类是以讲授语法为主线,即流行的教科书方式,所涉及的例题均以正确的程序为主:第二类是以案例教学为主的教材,摆脱了语法的部分约束:第三类是以讲解编程技术为主的经验之作,主要针对已有编程基础的读者:第四类是针对编程容易产生错误的专题,对比正确与错误的程序以提高编程能力,涉及的内容比较专业.这些教材各有千秋,其共同的目的都是想教会读者如何编写正确.规范的程序.我们也曾在两部教材的每一章中尝试增加一节错误分析的内容,以期让

《C语言解惑》一第1章 操作符1.1 基本算术操作符

第1章 操作符 C语言解惑 C语言程序由语句构成,而语句由表达式构成,表达式又由操作符和操作数构成.C语言中的操作符非常丰富--本书的附录B所给出的操作符汇总表就是最好的证据.正是因为这种丰富性,为操作符确定操作数的规则就成为了我们理解C语言表达式的核心和关键.那些规则--即所谓的"优先级"和"关联性"--汇总在本书附录A的操作符优先级表里.请使用该表格来解答本章中的谜题. 谜题1.1 基本算术操作符 请问,下面这个程序的输出是什么? main() { int x;

C#正则表达式判断输入日期格式是否正确_正则表达式

本文将介绍一段实例代码,来讲解利用正则表达式使C#判断输入日期格式是否正确的方法.希望这段代码能对大家有所帮助.  通常我们在用C#编写系统程序或者Web开发时,都会遇到需要验证输入的字符串是否是日期的情况,下面为大家介绍一种非常全面的用正则表达式验证日期的方法:  c 正则表达式日期代码一: /// <summary> /// 是否为日期型字符串 /// </summary> /// <param name="StrSource">日期字符串(20

c-用C语言实现在键盘输入两个十进制数,然后在屏幕输出这两个数中较大的那个数

问题描述 用C语言实现在键盘输入两个十进制数,然后在屏幕输出这两个数中较大的那个数 我是这样写的: #include #include void main() { scanf("%d,%d",&a,&a,&b); c=max(a,b); print("max=%d",c); return 0; } 可是怎么就不对了呢?想不明白..啊-- 解决方案 1;如wolf所说,多一个&a,多return 0; 2;a,b,c没定义 3;我记得标

《C语言解惑》一导读

前言 C语言解惑 C语言并不大--如果以参考手册的篇幅作为衡量标准的话,C语言甚至可以归为一种"小"语言.不过,这种"小"并不意味着C语言的功能不够强大,而是说明了C语言里的限制性规则比较少.C语言本身的设计非常简洁精妙,这一点相信C语言的使用者早已有所体会. 不过,C语言的这种精妙对C语言的初学者来说,似乎是故作神秘.因为限制较少,C语言可以写成内容丰富的表达式,这可能会被初学者认为是输出错误.C语言的紧凑性允许以简洁凝炼的方式实现常见的编程任务. 学用C语言的过

c#-用dataGridView制作表格,在删除时获取选中行ID的时候提示输入字符串格式不正确?

问题描述 用dataGridView制作表格,在删除时获取选中行ID的时候提示输入字符串格式不正确? if (dataGridView1.SelectedRows.Count != 0) { shangpinid = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[0].Value.ToString()); sql = string.Format("DELETE FROM shangpin WHERE ID={0}", shang

单词计数-为啥c语言程序运行数据输入后回车无效

问题描述 为啥c语言程序运行数据输入后回车无效 #include int main() { int ch,i,count=0,flag=0; char bb[1000]; printf("please input some words:"); gets(bb); ch=bb[i]; for(i=0;ch!='';i++) { if(ch==' ') flag=0; else if(flag==0) { count++; flag=1; } } printf("单词个数为%d&

在C#窗体程序中,如何判断textbox控件中输入的格式是浮点型

问题描述 在C#窗体程序中,如何判断textbox控件中输入的格式是浮点型?求教,谢谢咯! 解决方案 解决方案二:简单点try{float.Parse();}catch{//不是}解决方案三:1L方法最简单,还可以用正则判断解决方案四:Regex.IsMatch(strValue,@"^d+.d+$")解决方案五:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSyst

c语言-C语言用scanf清理输入缓存的一个程序

问题描述 C语言用scanf清理输入缓存的一个程序 源程序如下:#includeint main(){ int num; printf(""输入数字:""); scanf(""%d""&num); printf(""输入了数字:%dn""num); printf(""是否继续测试:[Y/N]"");scanf(""%*[