C:结合返回& scanf()在一行中

时间:2012-08-04 21:52:59

标签: c stdin scanf

我正在用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是否是正确的选择,但这就是搜索告诉我的。

4 个答案:

答案 0 :(得分:3)

当然可以:

int scanInt(void) {
  int result;
  return (scanf(" %i", &result), result);
}

但它有用吗?可能不是。


请注意,乍一看这个可能看起来像未定义的行为,因为您正在一个表达式中写入和读取相同的内存位置。但它不是,因为逗号运算符引入了一个序列点。

答案 1 :(得分:2)

您不能使用scanf执行此操作:您将返回scanf返回值,它仅指示成功读取的项目数。如果您需要返回choice,则需要致电scanf填写choice,然后分两步返回。

这里的另一点是你应该检查scanf的返回值:如果它无法转换输入,它将失败。在您的代码中,如果输入不是整数,scanf将失败。

此外,scanfstdin读取 - 标准输入 - 默认情况下,您不能将其作为参数传递,除非您使用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。该函数需要一个内存位置来存储结果,并且不返回它。所以你只需要使用额外的代码。