Zen*_*ter 2 c arrays variables printf scanf
我是自学C,目前正在研究Scanf和Printf函数.
我调整了这个程序来测试自己:
char topping[24];
int slices;
int day, year;
float cost;
char month[10];
printf(" How much does a pizza cost in your area?\n");
printf("$");
scanf(" %f", &cost);
printf("What is your favorite one-word pizza topping?\n");
scanf(" %s",topping);
printf("How many slices of %s pizza, topping can you eat in one sitting\n",topping);
scanf(" %d", &slices);
printf(" What is today's date (enter in the following format 1-Jan-2016 )\n");
scanf(" %d-%s-%d", &day, month, &year);
printf("\nWhy not treat yourself to dinner on %d-%s-%d and have %d slices of %s pizza ? It will only cost you %.2f", day, month, year,slices, topping,cost);
Run Code Online (Sandbox Code Playgroud)
这个练习的目的是让我掌握对scanf功能的理解以及它们的"精致"程度.
我的测试程序运行良好...除了年变量的输出.
为什么年份中的输出变量会出现乱码,我该如何解决?
谢谢.
这是问题所在.该%s说明符,用来读取任何字符,直到下一个空格.所以,经过%d-匹配1-,然后%s匹配Jan-2016.然后下一个%d失败,因为没有什么可以匹配.
首先,您应该始终检查返回值,scanf以便了解是否存在匹配的故障.例如,在这种情况下:
if ( 3 != scanf(" %d-%s-%d", &day, month, &year) )
{
printf("Matching failure occurred.\n");
// do something else...
}
else
{
printf("Why not treat yourself...
Run Code Online (Sandbox Code Playgroud)
其次,要真正避免这个问题.scanf你可以看到,这个功能非常有限.要使用其他分隔符而不是空格,可以使用scanset说明符%[.....]:
scanf(" %d-%9[^-]-%d", &day, month, &year)
Run Code Online (Sandbox Code Playgroud)
(使用相同的错误检查).scanset说明符意味着读取与其中的字符匹配的任何字符(可能包括空格)[],除了a ^表示与下一个字符不匹配.所以这将一直读到下一个-.另外我添加了9以避免溢出大小的缓冲区9+1.
当然这意味着如果这个人永远不会打字,-那么这个程序会有点奇怪.您可以通过使格式字符串越来越复杂来解决此问题; 或者您可以fgets使用sscanf上述字符串读取整行,然后使用该函数.这将捕获该人在键入另一个之前按Enter的情况-.
实际上,事实证明,一次读取整行然后返回并处理该行通常是一个好主意.
在某些阶段,你会厌倦多么糟糕scanf,并制作自己的解析器.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |