C - 两种类型的格式化用户输入,输入数量未知

C - Two types of formatted user input with an unknown number of inputs

我希望用户能够输入两种类型的输入,例如:“C[some size_t]”和“O[some memory address]”,这取决于它是 C 还是 O一开始,我会调用不同的函数。我还希望能够以任何顺序接收未知数量的这些输入。

我的解决方法是这样的:

int main()
{
    // variables

    while (1) { // Infinite loop to take in multiple unknown amount of inputs?
        while (fgets(input, BUFFER_SIZE, stdin)) {
            if (sscanf(input, "%c%zu", &branch, &num) == 2) {
                if (strcmp(&branch, "C")
                    // function call
            } else if (sscanf(input, "%c%c", &branch, (char *)addr) == 2) {
                if (strcmp(&branch, "O")
                    // function call
            }
        }
    }

    return 0;
}

我当然明白为什么它不起作用,我知道我的非解决方案是错误的,但我不知道还有什么办法可以解决这个问题。代码接受第一个输入并挂起,如果我从一个以 O 开头的输入开始,它将进入第一个 if 语句,而这是不应该的。我也不确定我的 while(1) 循环是否是处理多个用户输入的正确方法。

您尝试一次读取 branch 字符和相应的参数——但是两种情况下的参数不同。所以你需要先阅读字符,然后决定,然后只 然后 扫描参数——一旦你知道要扫描什么,从而能够 select 适当的格式化字符串。

正如您刚刚读入的 任何 字符,您可以使用 getc 来更简单一点,顺便说一句:

char branch = getc(); // instead of `if(scanf("%c", &branch) == 1)`
                      // note: would have been one single scan (branch) only!
if(branch == 'C')
{
    // scan num
}
else if(branch == 'O')
{
    // scan addr
}
else
{
    // error handling
}

或者(我个人更喜欢)

char branch = getc();
switch(branch)
{
case 'C':
    // scan num
    break;
case 'O':
    // scan addr
    break;
default:
    // error handling
    break;
}

请注意,strcmp 需要以 null 结尾的字符串(字符数组)并且不能用于比较单个字符——这些需要通过相等运算符进行比较,见上文。