史前:我遇到的问题是,由于没有对任何给定输入的请求,并且程序只是继续进行进一步处理,因此无法正确处理getchar()函数。
我在互联网上搜索了可能出现的问题的信息,并发现以下信息:如果在getchar()函数之前将scanf()函数实现到程序中,则getchar()函数的行为不正确,并且会像我的问题一样。
引文:
[我敢打赌,您有一百美元,当对getchar()的调用之前带有scanf()时,您只会看到此问题。
请勿将scanf用于交互式程序。这样做的主要原因有两个:
1)scanf无法从格式错误的输入中恢复。您每次都必须正确获取格式字符串,否则它将丢弃所有不匹配的输入,并返回一个指示失败的值。如果仍然无法恢复不良的格式时,如果您要解析固定格式的文件,则可能会很好,但这与您要使用用户输入所做的完全相反。使用fgets()和sscanf(),fgets()和strtok(),或使用getchar()和putchar()编写自己的用户输入例程。
1.5)即使正确使用,scanf也不可避免地会丢弃有时可能很重要的输入(空格)。
2)scanf有一个讨厌的习惯,在输入流中保留换行符。如果您不使用scanf,则最好使用它,因为scanf通常会急切地跳过所有空格字符,以寻找下一个期望的东西。但是,如果将scanf与fgets / getchar混合使用,试图弄清楚输入流中可能残留的内容很快就会变得一团糟。尤其是如果您执行任何循环操作-第一次迭代中输入流会有所不同是很常见的,这会导致潜在的怪异错误,甚至怪异的尝试来修复它。
tl; dr-scanf用于格式化输入。用户输入未格式化。 //
这里是该线程的链接:https://bbs.archlinux.org/viewtopic.php?id=161294
scanf()与:
scanf("%d",integer_variable);
对我来说,这似乎是场景的新手,这是从键盘(或更好的说是stdin文件)输入十六进制数字并将其存储到int变量的唯一可能方法。
是否有其他方法可以从标准输入中输入十六进制值并将其存储到整数变量中?
奖金挑战:如果我可以将负值(当然是通过负十六进制输入)写入一个有符号的int变量,那也很好。
INFO:我在Stackoverflow上阅读了很多有关类似问题的C线程,但是这些线程都不能很好地回答我的明确问题。所以我已经发布了这个问题。
我在Linux Ubuntu下工作。
在scanf
手册页中,您可以使用scanf将十六进制数字从stdin读取到(无符号)整数变量中。
unsigned int v ;
if ( scanf("%x", &v) == 1 ) {
// do something with v.
}
根据手册页,%x
始终是无符号的。如果要支持负值,则必须添加显式逻辑。
如您发布的链接中所述,使用fgets
和sscanf
是处理此问题的最佳方法。 fgets
将读取整行文本,sscanf
将分析该行。
例如
char line[100];
fgets(line, sizeof(line), stdin);
int x;
int rval = sscanf(line, "%x", &x);
if (rval == 1) {
printf("read value %x\n", x);
} else {
printf("please enter a hexadecimal integer\n");
}
关于一百美元赌注的报价是准确的。将scanf
与getchar
混合在一起几乎总是一个坏主意;它几乎总是会带来麻烦。但是,并不是它们不能一起使用。可以将它们一起使用-但通常这太困难了。有太多繁琐的小细节和“陷阱”需要跟踪。麻烦多于其应有的价值。