我想问一个具体的问题并获得用户读取的Y / N答案。我需要使用字符Y或N来最终改变下一个问题的结果,这就是为什么我需要保存字符以便稍后检索它。我不想使用字符串或for / while循环。另外,为什么我需要在"%c *"之后加入*?
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int avgTemp, lowestTemp, temperature;
char choice ='Y';
char decision ='N';
printf("What is the average temperature?\n");
scanf("%d", &avgTemp);
printf("What is the lowest temperature in last 24 hours?\n");
scanf("%d", &lowestTemp);
printf("Has the temperature been over 99 degrees F for more than 30 minutes?
Please answer Y for yes and N for no.\n");
scanf("%c*", &choice);
printf("choice is %c", choice);
return 0;
}
答案 0 :(得分:3)
另外,为什么我需要在&#34;%c *&#34;之后包含*?
%c*
表示扫描一个字符,然后是*
(它将丢弃)。也许你的意思是%*c
,这意味着要扫描但丢弃它。你不需要其中任何一个。
scanf
是一个非常有问题的功能,应该避免。您的程序说明了问题。 scanf
没有阅读整行。 scanf
只会将stdin扫描到您要求的内容,然后停止。这意味着额外的输入和换行有时可以保留在输入流上,以用于下一个毫无疑问的scanf
。从手册页...
每个连续的指针参数必须与每个参数正确对应 连续转换说明符(但请参阅下面的*转换)。所有 转化由%(百分号)字符引入。格式字符串还可以包含其他字符。格式字符串中的空格(例如空格,制表符或换行符)与任何格式匹配 输入中的空白量,包括无空白量。其他一切只有匹配 本身。当输入字符与这种格式字符不匹配时,扫描停止。当无法进行输入转换时,扫描也会停止(见下文)。
这使非常容易意外地在输入缓冲区上留下字符。您的每个scanf("%d")
都会读取该号码并停止。这会在输入缓冲区上留下换行符。这适用于%d
,因为......
转换开始之前,大多数转化会跳过空格
...但不适用于%c
。
匹配一系列宽度计数字符(默认值为1);下一个指针必须是指向char的指针,并且必须有足够的空间容纳所有字符(不添加终止NUL)。 通常跳过前导空格被抑制。要先跳过空格,请使用格式的显式空格。
所以你需要scanf(" %c")
才能让它发挥作用。
scanf
应该避免,因为它非常非常容易受到意外输入的影响。尝试给予&#34; foo&#34;第一个问题。所有scanf("%d")
都会默默地失败。 scanf("%c")
将阅读f
。
相反,请使用getline
(首选处理内存分配)或fgets
读取整行,然后在结果字符串上使用sscanf
。这避免了上述所有问题。