扫描Y / N并保存以供将来使用

时间:2016-06-03 22:54:09

标签: c char

我想问一个具体的问题并获得用户读取的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;
}

1 个答案:

答案 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。这避免了上述所有问题。