1

我可以scanf(...)用作函数的参数吗?像这样:

printInteger(scanf(....));

我可以scanf用来将我读取的值归因于某个变量吗?像这样:

n = scanf(...);

ps:我在这里解释我为什么要问这个。

我知道这个问题可能有点奇怪,但我正在一个项目中工作,该项目正在开发一个编译器,该编译器将某种语言作为输入,然后编译为 C。

例如,这是我的语言,我们称之为“stackoverflow”;)

proc printInteger(integer k)
    integer i;
        begin
            for i = 1 to k do
                print i;
        end

proc main()
    integer n, i;
    boolean ok;
    begin
        printInteger(getInteger);
        n = getInteger;
        ok = true;
        while i < n do
            begin
                print i;
                i = i + 1;
            end
        if ok then print 1; else print 0;
    end

我不会深入了解该语言,但请注意,这getInteger意味着我想做一个scanf(...),我的意思是,当出现getInteger我想编译为scanf(...)时,这就是为什么我想知道一些使用方法的原因scanf(...)

4

2 回答 2

5

我可以使用 scanf(...) 作为函数的参数吗?像这样:

printInteger(scanf(....));

我可以使用 scanf 将我读取的值归因于某个变量吗?像这样:

n = scanf(...);

可以scanf其用作函数的参数,但这两个问题的真正答案是否定的:scanf 返回任何扫描的数据,它返回成功扫描的项目- 或者EOF如果在任何成功之前达到输入结束扫描。您只能访问使用作为scanf参数传递以接收值的指针扫描的项目。因此,虽然您可以scanf参数作为参数传递给函数,但它不会做您想要的。

如果您想getInteger用您的语言(在 C 中)实现该操作,则很难提出建议,因为只有您知道该语言/操作应该如何工作。只需使用scanf,实现将如下所示:

int nextInt;
int numScanned = scanf("%d", &nextInt);

if (numScanned < 1)
    handleError();
return nextInt;

但是,如果您正在对您的语言进行一般解析,那么 usingscanf是一个坏主意:您很快就会遇到 的限制问题scanf,并且您将无法预测所有输入类型,除非您的语言真的很简单,比您包含的示例更简单。

要正确执行此操作,请lex为 C 找到一个好的库。这将避免很多麻烦。否则,如果您必须自己进行词法分析,请开始查看fgets,从您的输入中一次获取一行,然后自己进行标记化。

于 2012-08-12T20:25:21.867 回答
1

你问:

我可以使用 scanf(...) 作为这样的函数的参数吗?

printInteger(scanf(....));

第一个问题的答案是“是的,但是……”。

我可以使用 scanf 将我读取的值归因于这样的变量吗?

n = scanf(...);

第二个答案是“不,因为……”。

“但是”主要是“但它并没有达到你的预期,所以你很少会这样做,如果有的话”。

在第一个示例中,scanf()返回成功转换的(整数)个数,如果达到 EOF,则返回 EOF。在任何情况下,它都不会返回它刚刚读取的值(尤其是因为它通常读取多个值并且其中大多数不是整数)。因此,如果您想打印已转换的值的数量,您可以使用该printInteger()函数来执行此操作,但这不是您通常想要做的。

同样,在第二种情况下,您当然可以将结果分配给所示scanf()的整数n(如果您需要报告错误,这样做通常是明智的)。但是,这不是读取的值(假设您有%d转换规范);它是成功转换的次数。

于 2012-08-12T21:03:45.377 回答