我想问一个特定的问题,并得到用户读入的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;
}
发布于 2016-06-04 07:42:20
还有,为什么我需要在"%c*“后面加上*?
%c*
意味着先扫描一个字符,然后再扫描一个*
(它将丢弃该字符)。也许你指的是%*c
,意思是做扫描,但丢弃它。你不需要它们中的任何一个。
scanf
是一个非常有问题的函数,应该避免使用。你的程序说明了这个问题。scanf
不会读取整行内容。scanf
将只扫描标准输入,直到您请求的内容,然后停止。这意味着额外的输入和换行符有时可以留在输入流中,用于下一个不可信的scanf
。从手册页...
每个连续的指针参数必须与每个连续的转换说明符正确对应(但请参阅下面的*转换)。所有转换都由%(百分号)字符引入。格式字符串还可以包含其他字符。格式字符串中的空格(如空格、制表符或换行符)可匹配输入中的任意数量的空格,包括无空格。其他所有东西都只与它自己匹配。当输入字符与此类格式字符不匹配时,扫描停止。当无法进行输入转换时,扫描也会停止(见下文)。
这使得意外地将字符留在输入缓冲区变得非常容易。你的每一个scanf("%d")
都会读入这个数字并停止。这会在输入缓冲区上留下一个换行符。这对%d
来说很好,因为..。
在转换开始之前,大多数转换都会跳过空白
不适用于%c
的...but。
匹配宽度计数字符序列(默认值为1);下一个指针必须是指向char的指针,并且必须有足够的空间容纳所有字符(没有添加终止NUL )。通常跳过的前导空格被取消。要先跳过空格,请在格式中使用显式空格。
所以你需要scanf(" %c")
来让它工作。
应该避免使用scanf
,因为它非常容易受到意外输入的影响。试着给第一个问题加上"foo“。所有scanf("%d")
都将静默失败。scanf("%c")
将读取f
。
取而代之的是,使用getline
(首选,因为它为您处理内存分配)或fgets
读取整行代码,然后对结果字符串使用sscanf
。这就避免了上述所有问题。
https://stackoverflow.com/questions/37624553
复制相似问题