我是编程新手,我正在编写一个程序,将十进制转换为二进制数字分析课程。我对如何处理变量形式的输入有点困惑。例如,输入可以是以下两种形式之一:
Input: 15
或Input: 15 / 2
如果它只是两种情况中的一种,我知道如何处理输入:
分别为 scanf("%d", &userInput);
和scanf("%d / %d", &numerIn, &denomIn);
。
我尝试了许多没有运气的战术。我接近以下内容:
(1) int numerIn, denomIn = 1;
(2) printf("Enter decimal number: ");
(3) scanf("%d", &numerIn);
(4) if (!feof(stdin)) {
(5) scanf(" / %d", &denomIn);
(6) }
不幸的是,这并没有顺利进行。我已经尝试在%d&之前和之后以及在第3和第5行中使用不同的空格组合,但无济于事。我也认为可能有一些方法来编写程序,如果在第一个整数后没有输入任何东西,程序可以知道自动默认使用denomIn中的默认值1,但我可以'无论如何都要想出来。
有没有办法解决我忽略的这个要求?我对C编程非常陌生,所以我很可能在这里犯了一个令人尴尬的新手错误。话虽如此,是否有任何好文章可以准确解释输入缓冲区的工作原理?这对我来说有点混乱。
提前致谢!任何见解都会在这一点上受到高度赞赏。
答案 0 :(得分:1)
答案 1 :(得分:1)
请注意scanf
不是我在生产程序中使用的东西。它太脆弱了。但是对于简单的测试程序,它比编写自己的解析器更方便。
使用scanf
的好处是它可以处理空白变化,并进行数字转换,同时处理轻微的解析任务,例如查找'/'
字符
使用scanf
的缺点是,如果输入有问题,scanf
很有可能无法检测到它,scanf
将离开的可能性相同stdin
处于未知状态(需要额外的代码来清理混乱)。
解决scanf's
糟糕错误处理的一种方法是使用fgets
读取一行用户输入,然后使用sscanf
来解析该行。这样,如果出现问题,至少stdin
将处于已知状态。
以下代码演示了如何使用fgets
和sscanf
来获取用户输入。首先fgets
从stdin
读取一行输入并将其放入数组line
。如果fgets
在读取任何字符之前遇到文件结尾,它将返回NULL,程序将退出。
接下来,调用sscanf
来解析该行并提取分子和分母。如果只找到分子,sscanf
将返回1。如果它同时找到分子和分母,它将返回2。请注意,格式为"%d /%d"
的斜杠前面的空格很重要。它告诉sscanf
在查找斜杠时跳过空格。
程序的其余部分只是将用户输入回送到输出。
#include <stdio.h>
int main( void )
{
int numer, denom, count;
char line[64];
for (;;)
{
printf( "Enter decimal number: " );
fflush( stdout );
if ( fgets( line, sizeof line, stdin ) == NULL ) {
printf( "Bye\n" );
break;
}
count = sscanf( line, "%d /%d", &numer, &denom );
if ( count == 1 ) {
denom = 1;
printf( "You entered %d\n", numer );
}
else if ( count == 2 ) {
printf( "You entered %d/%d\n", numer, denom );
}
else {
printf( "You entered garbage\n" );
}
}
}