我被要求在大学里做一份海鲜菜单。我将在此处提供相关代码:
int main ()
{
int a,d;
float c ;
char b,s,S,m,M,l,L;
printf ("\n\t\t\t\tSeafood Menu\n");
printf ("----------------------------------------------------------------------------------\n");
printf ("\t\t\t\t\t\t Dish Size\n");
printf ("Item Number\t Seafood Dish\t Small\t Medium Large\t\n");
printf ("----------------------------------------------------------------------------------\n");
printf ("\t 1\t Fried \t20.00 \t\t 40.00 \t\t 55.00\n");
//Continue with a bunch of menu here
printf (" Enter item number :");
scanf ("%d",&a);
printf (" Enter dish size (S/M/L) :");
scanf ("%s",&b);
if ((a==1)&&((b=='s')||(b=='S')))
{c=20.00;}
//continue with a bunch of condition to choose the price per dish stated in the menu
printf (" Enter dish quantity :");
scanf ("%d",&d);
printf (" Price per dish size :RM%.2f\n\n\n",c);
return 0;
}
当我尝试将格式标识符更改为%c时,它只是停止接受该特定scanf的输入。
printf ("Enter dish size (S/M/L):");
scanf ("%s",b);
我想附加图像,但似乎不允许这样做,将留下两个链接:
Normal, using %s:和abnormal, using %c
我很好奇为什么当我使用
%c
而%s
有效时为什么它不起作用?当我输入所有内容时,只有角色。请赐教。 最佳答案
我很好奇为什么当我使用%c而%s可以工作时为什么它不起作用?
好吧,猜猜是什么,即使它看起来可行,它也不起作用。
如手册页所述,对于scanf()
,参数类型为%c
需要一个指向char
的指针%s
需要一个指向char
数组的初始元素的指针。
引用C11
,第§7.21.6.2章(重点是我的)
c
匹配与该字段指定的数字完全相同的字符序列
宽度(如果指令中没有字段宽度,则为1)。
如果没有l
长度修饰符,则相应的参数应为
指向足够大的字符数组的初始元素的指针,可以接受
顺序。没有添加空字符。
s
匹配非空格字符序列。
如果没有l
长度修饰符,则相应的参数应为
指向足够大的字符数组的初始元素的指针,可以接受
序列和终止的空字符,这些字符将自动添加。
就你而言
提供%s
是错误的,因为单个char
是一个太短的元素,无法扫描并保存以空值结尾的数组。由于发生内存溢出,因此导致undefined behavior。
如果输入流没有上次按ENTER键存储的%c
,则newline
应该已经“工作”。如果清除所有未决输入的输入流,则会看到它起作用。使用类似
scanf(" %c", &b); //the whitespace "eats up" all the previous whitespaces
您可以查看我的this previous answer,以获取更多信息。
关于c - %c与%s的实际差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42840090/