我被要求在大学里做一份海鲜菜单。我将在此处提供相关代码:

 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/

10-12 01:28