我正在用C编写一个程序,显示一个菜单,要求用户做出决定。
我想在程序中多次调出菜单,所以我将其付诸实践。
每个选项都有一个与之关联的数字:
(1) Add
(2) Subtract
该函数显示菜单,然后我scanf
int
对局部变量的响应,然后返回变量(我当然在函数开头声明变量)。
int function ()
{
int choice;
// *insert print menu code here*
scanf(" %i", &choice);
return choice;
}
我可以通过某种方式做到:return scanf(" %i", stdin);
我不确定stdin
是否是正确的选择,但这就是搜索告诉我的。
答案 0 :(得分:3)
当然可以:
int scanInt(void) {
int result;
return (scanf(" %i", &result), result);
}
但它有用吗?可能不是。
请注意,乍一看这个可能看起来像未定义的行为,因为您正在一个表达式中写入和读取相同的内存位置。但它不是,因为逗号运算符引入了一个序列点。
答案 1 :(得分:2)
您不能使用scanf
执行此操作:您将返回scanf
的返回值,它仅指示成功读取的项目数。如果您需要返回choice
,则需要致电scanf
填写choice
,然后分两步返回。
这里的另一点是你应该检查scanf
的返回值:如果它无法转换输入,它将失败。在您的代码中,如果输入不是整数,scanf
将失败。
此外,scanf
从stdin
读取 - 标准输入 - 默认情况下,您不能将其作为参数传递,除非您使用fscanf
,否则行为相同方式。
您是否考虑过使用fgets
作为输入? 返回下一个输入行,将允许您在return
语句中执行读取,因为fgets
返回下一行输入作为一个字符串。但是你仍然需要自己解析输入,这可能发生在你的function
中。在任何情况下,fgets
通常是用户输入的更好选择,因为它分离读取输入和解析输入,并避免因使用与您的格式字符串不匹配的输入而使用scanf
时出现的问题。 / p>
答案 2 :(得分:1)
你可以,但不要。
scanf
返回扫描的项目数。您无法使其返回其中一个扫描项目的值。
return scanf(" %i", &choice), choice;
这使用逗号运算符(不要与函数参数之间的逗号分隔符混淆),它会计算两个操作数并产生右操作数的结果。
但没有充分理由这样做。使源代码更加紧凑是没有什么好处的。多行表单更清晰,通过添加错误处理更容易修改(如果用户输入的不是数字,会发生什么?)
或者您可以编写自己的函数来调用scanf
并返回所需的值,但这仍然无法解决错误处理问题。
如果你的目标只是将它们放在一条线上:
scanf(" %i", &choice); return choice;
但同样,这不是一种改进。
答案 3 :(得分:0)
不,您不能使用scanf
。该函数需要一个内存位置来存储结果,并且不返回它。所以你只需要使用额外的代码。