【问题标题】:C - Two types of formatted user input with an unknown number of inputsC - 两种类型的格式化用户输入,输入数量未知
【发布时间】:2022-01-09 20:18:25
【问题描述】:

我希望用户能够输入两种类型的输入,例如:“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) 循环是否是处理多个用户输入的正确方法。

【问题讨论】:

  • 小心:所有字符串函数(如strcmp)都希望它们的参数是正确的以空值结尾的字符串。您不能将单个字符视为字符串。如果要比较字符,请使用普通比较,例如 ==。如if (branch == 'C')
  • 虽然它不适用于您的情况(因为一开始是错误的)请记住,如果两个字符串相等,strcmp 将返回 0。而0 被认为是false
  • 我还建议您添加某种 prompt 以便用户知道程序已准备好读取输入。
  • @Someprogrammerdude 哦!谢谢,我忘记了。比较字符串时我仍然处于Java思维方式哈哈
  • 为什么要扫描两次到branch?你不会只扫描一次然后检查吗? if(scanf(branch) == numberOfScannedValues) { if(branch == ...) {} else if(branch == ...) {} } else { /* handle invalid input */ } - 您必须在各自的 ifs 内分别扫描第二个参数。

标签: c input io


【解决方案1】:

您尝试一次读取 branch 字符和相应的参数 - 但是两种情况下的参数不同。因此,您需要首先读取字符,然后决定并仅然后扫描参数——只要您知道要扫描什么,从而能够选择适当的格式字符串。

顺便说一下,当您阅读 any 字符时,您可以使用 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 需要以空字符结尾的字符串(字符数组)并且不能用于比较单个字符——这些需要通过相等运算符进行比较,见上文。

【讨论】:

  • 谢谢!这非常有帮助,但我将如何扫描其余的论点?第一个字母和第二部分没有用空格或任何东西分隔。我尝试在每种情况下都放置一个if(scanf("%c%zu", &branch, &num) == 2),但是当我尝试打印 num 的值时,例如,它不会读取第一个整数。例如。如果用户输入“C124”,num 设置为 24。我猜这与空终止符有关?
  • @bachtick 不,一点也不。请记住,使用getc,您已经阅读 C 字符,所以剩下的就是124。如果您现在扫描"%c%zu",您正在将'1' 作为字符读入branch,而将24 留给num。因此,一旦您已经获得C,您 扫描号码:if(scanf("%zu", &num) == 1) { ... },类似地为addr
  • 哦,有道理!傻我。非常感谢
猜你喜欢
  • 2016-11-28
  • 2015-09-03
  • 2014-05-17
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多