-2

我正在用 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

4 回答 4

3

你当然可以:

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

但是有用吗?可能不是。


请注意,乍一看,这可能看起来像未定义的行为,因为您在一个表达式中从同一内存位置进行写入和读取。但事实并非如此,因为逗号运算符引入了一个序列点。

于 2012-08-04T22:15:26.693 回答
2

你不能这样做scanf:你将返回 的返回值scanf它只表示成功读取的项目数。如果您需要退货,choice则需要致电scanf填写choice并分两个单独的步骤退货。

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

此外,scanf从 - 标准输入读取stdin- 默认情况下,您不能将其作为参数传递,除非您使用fscanf,否则其行为方式相同。

您是否考虑过使用fgets您的输入?它确实返回下一个输入行,这允许您在return语句中进行读取,因为fgets将下一行输入作为字符串返回。但是您仍然需要自己解析输入,这可能应该发生您的function. 在任何情况下,fgets它通常是用户输入的更好选择,因为它将读取输入与解析输入分开,并避免在使用时scanf由于输入与格式字符串不匹配而出现问题。

于 2012-08-04T21:55:44.823 回答
1

你可以,有点——但不要。

scanf返回扫描的项目数。您不能让它返回扫描项目之一的值。

return scanf(" %i", &choice), choice;

这使用逗号运算符(不要与函数参数之间的逗号分隔符混淆),它计算两个操作数并产生正确操作数的结果。

但是没有充分的理由这样做。像这样使您的源代码更紧凑并没有什么好处。多行表单更清晰,并且通过添加错误处理更容易修改(如果用户输入的不是数字会发生什么?)

或者您可以编写自己的函数来调用scanf并返回您想要的值,但这仍然不能解决错误处理的问题。

如果您的目标只是将它们放在一条线上:

scanf(" %i", &choice); return choice;

但同样,这不是一种改进。

于 2012-08-04T22:20:38.957 回答
0

不,你不能用scanf. 该函数需要一个内存位置来存储结果,并且不返回它。所以你只需要忍受额外的代码。

于 2012-08-04T21:55:45.863 回答