【问题标题】:C more arguments than required scanfC 参数多于所需的 scanf
【发布时间】:2014-04-21 04:34:52
【问题描述】:

我有一个带有 scanf() 的 while 循环,它读取单个 char* 值:

char c[9];

while(c != 'q')
{
    scanf("%s", c);
}

然后将c 与多个单字符字符串进行比较以确定应该执行哪个操作。

这个 scanf 可以接收多个参数,我需要知道何时只向函数提供一个参数,或者是否有多个参数,但是每当我输入多个参数时,while 循环会为输入的每个参数单独运行.


编辑:

假设我输入“a b c d”之类的内容,while 循环将处理 c="a"c="b"c="c"c="d",这很好,但我需要知道我输入了 4 个非上次扫描中的空白元素。

所以第一个参数是我要运行的命令,它是一个字母,然后是该命令的 0 到 3 个参数,它们是字符串或数字:

例子:

"a box 1 2"

当参数的数量固定时,我只是使用一个布尔值来知道 c 的下一个 x 值应该是参数,但是我有一个可以接受 0 或 1 个参数的函数,例如

"b" is acceptable.
"b 25" is acceptable.

b 基本上是一个搜索函数,其中可选参数是要检查的查询。如果没有提供参数,它会列出所有项目。因此在这种情况下布尔值不起作用,因为参数的数量不固定。

所以我需要知道,如果我输入:

"a 1 2 3"  x=4
"a 1"      x=2
"a"        x=1

【问题讨论】:

  • 我不明白你在问什么。你知道有多少参数提供给scanf,因为你编写了代码。无论如何,转换次数取决于格式字符串,而不是其他参数。如果您传递的参数多于所需参数,则多余的参数将被忽略。
  • 在这种情况下,scanf() 总是正好有两个参数。确定函数接收多少参数的方法是查看您的代码并用您的眼球搜索有问题的函数调用。此外,您将 chars 数组与单个 char 进行比较完全没有意义。
  • @Barmar 基本上 scanf 函数允许我为该函数输入多个参数,并且每当我这样做时,它会分别循环遍历每个参数的 while 循环,所以我无法知道最初向 scanf 提供了多少参数。
  • @David,改变 'char c[9];' 会有帮助吗到'char c;'并使用 'scanf("%c", &c);'代替?
  • 您似乎想输入一行 文本,例如“a b c d\n”,然后代码确定有 4 个非空白 char 参数,每个参数长度一:'a',b','c','d'。然后它处理这 4 个并重复或停止。对吗?

标签: c scanf


【解决方案1】:

将 IO 与扫描/解析分开。

char buf[100];
fgets(buf, sizeof buf, stdin);
int count = 0;  // Count of arguments.
char *p = buf;

while (*p) {
  if (!isspace((unsigned char) *p)) {
    count++;
    // Do something, if desired with *p
  }
  else {
    Handle_UnexpectedWhiteSpaceChar();
  }
  if (isspace((unsigned char) *p)) {
    p++;
  }
  else {
    Handle_UnexpectedTwoNonSpaceChar();
  }

【讨论】:

  • 这看起来很有希望。
  • 有很多方法可以解决这个问题。挑战包括文本行不是 C 字符串,并且处理恶意用户 IO 最好与解析/扫描分开完成。强烈建议不要使用scanf(),因为它结合了 IO 和解析,而且效果都不好。
  • @David fgets() 在读取文本行和形成 C 字符串方面做得很好。 BTW GTG
【解决方案2】:

这将允许您在每一行输入一系列数字,直到您输入 q

char line[1024] = "";
int nums[MAXNUMS];
int counter = 0;
while (strcmp(line, "q\n") != 0) {
    fgets(line, sizeof(line), stdin);
    while (counter < MAXNUMS && sscanf("%d", &nums[counter])) {
        counter++;
    }
}

【讨论】:

  • 那么当输入结束时我在哪里引用counter?在我退出程序之前,扫描仪不会继续扫描吗?
  • 当用户输入q时循环停止。
  • 好吧,我想这就是我被误解的地方。这个循环应该一直持续到输入 q,但是假设我在扫描仪中输入了 1 2 3,我需要知道我刚刚输入了 4 个元素;输入这 4 个元素后,我很可能不会退出循环,那么如何获得计数?
  • @David 输入1 2 3的4元素是什么?
  • @chux 它是“a 1 2 3”
猜你喜欢
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2021-10-29
相关资源
最近更新 更多