2012年软考程序员辅导:程序员C语言新人常见问题

来源:软件水平考试    发布时间:2012-11-05    软件水平考试视频    评论

   4、scanf格式控制误用

  例如:

   #include

   int main(void)

   {

   float a,b,c;

   printf(“shuru 3 ge xi shu :”);

   scanf(“%f,%f,%f”,&a,&b,&c);

   printf(“he shi %f”,a + b + c);

   return 0;

   }

  解析:scanf()函数允许把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要与输入串准确匹配。否则,例如上面的程序,那么scanf()将其解释成,将键入一个数字,键入一个逗号,然后再键入一个数字,再键入一个逗号,最后再键入一个数学。也就是说必须像这样输入:2.3,5.1,3.8。如果不能精确匹配,则scanf()读取将失败。

  作为编写这个程序的人,你可以按照这个格式输入,但是用户则不知应该以何种格式输入。所以应该改为scanf(“%f%f%f”,&a,&b,&c);

  解决方案:scanf一行见解析。

   5、scanf参数错误

  例如:

   #include

   int main(void)

   {

   char str[80];

   printf(“Please enter your first name”);

   scanf(“%s”, &str);

   printf(“Hello %s”, str);

   return 0;

   }

  解析:scanf()中,读取int, long, float, double, char等类型的数据,是需要在第n(n>=2)个参数里加上&的,因为scanf()函数里,第n(n>=2)个参数是变量的地址,而不是变量本身:例如定义int num;则scnaf(“%d”, &num);而读取字符串是不需要加上&,因为字符串的变量名本身就代表了地址。所以例子中应为scanf(“%s”, str);同时,这条规则对于结构体内的变量的也适用,即

   struct foo {

   char ch;

   char str[80];

   int num

   }data;

  那么应该是

   scanf(“%c%s%d”, &data.ch, data.str, &data.num);

  解决方案:见解析

   6、数据类型混淆

  例如:

   #include

   int main(void)

   { int a;

   double b=1;

   for(a=1;a<=6;aA++)

   b*=A;

   printf(“%ld”,b);

   }

  解析:定义b为双精度浮点型,而输出使用%ld即长整型,数据类型不一致,输出为0.PS:老谭的书讲到用TC调试那一节举的例子貌似就是int a; 后面写到printf(“%f”,a);产生错误的。

  解决方案:把b定义为长整型long,即long b = 1;

  (其实这里还涉及到隐式转换,所以,更为正确的方法是把a也定义为长整型)

   7、C语言中的“除法”

  例如:

   #include

   int main(void)

   {

   printf(“请输入一个华氏温度/n”);

   float a,c;

   scanf(“%f”,a);

   c=5/9*(a-32);

   printf(“摄氏温度为%4.2f”,c);

   return 0;

   }

  解析:C语言中,两个整型数相除,如果不能除尽,那么小数部分会直接被丢弃,即“截尾”。因此5/9的结果是0.

  解决方案:应该使用类型转换,或者明确相除的两数的类型

  (1)c=(float)5/9*(a-32);

  (2)c=5.0/9*(a-32);

  (3)c=5.0/9.0*(a-32);

   8、混合输入数字和字符的杯具

   #include

   int main(void)

   {

   char ch;

   int num, i;

   printf(“Enter a character and a integer:/n”);

   while((ch = getchar()) != ’/n‘)

   {

   scanf(“%d”, &num);

   for(i = 0; i < num; ++i)

   putchar(ch);

   putchar(’/n’);

   printf(“Enter an another pair.Empty line to quit”);

   }

   return 0;

   }

  解析:这段程序表面看起来没有什么问题,但是,实际运行一遍的,就会发现,只输入了一组数据,程序就退出了。

  在开始的时候,程序运行良好,例如输入 a 2,程序就会打印出aa。但是,程序还没响应第二次输入就退出了。问题就出在换行符,这次是紧跟在第一个输入的2后面的那个换行符。scanf()函数将该换行符留在输入队列中,而getchar()并不跳过换行符。所以在循环的下一个周期,getchar()读取了第一次输入时的换行符,而换行符正是终止循环的条件。

  解决方案:吃掉输入流中的回车即可

  在while循环最后,加上以下语句

   while (getchar() != ’/n‘)

   continue;

  也可以加上fflush(stdin);刷新输入流。

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答