【问题标题】:Read input with commas (with sscanf)用逗号读取输入(使用 sscanf)
【发布时间】:2020-04-06 14:01:29
【问题描述】:

您好,我正在尝试以下列形式读取用户的输入:

param1,param2,param3

我通过fgets 得到的。问题是我似乎无法理解为什么它没有,在第一个逗号之后它向我展示了一种奇怪的行为。 例如:

char input[60];
char a1, a2, a3, a4;


printf("Enter info");
fgets(input, 60, stdin);
sscanf(input,"%[^,\n] %[^,\n] %[^,\n] %[^,\n]", &a1, &a2, &a3, &a4);
printf("%c %c %c %c", a1, a2,a3, a4);

如果我输入例如a,b,c,d 我得到:a � 我在这里错过了什么?

【问题讨论】:

  • %[...] 将读入一个需要结束 '\0' 字符的字符串。将您的变量设为char a[2]。另外我认为您的 sscanf 格式字符串与您的输入不匹配,因此您的变量实际上包含一些未初始化的垃圾数据。

标签: c input scanf


【解决方案1】:

添加到答案。您的格式字符串缺少实际的 , 逗号,因此 1,2,3,4 无法匹配。

你可以这样做

#include <stdio.h>

int main()
{
  char input[60];
  char a1[2], a2[2], a3[2], a4[2];


  printf("Enter info");
  fgets(input, 60, stdin);
  if (4 != sscanf(input,"%1[^,\n], %1[^,\n], %1[^,\n], %1[^,\n]", a1, a2, a3, a4))
    return printf("Error"), 1;

  printf("%c %c %c %c", a1[0], a2[0],a3[0], a4[0]);
  return 0;
}

注意sscanf 的错误检查如果成功,它应该返回它填充数据的变量数。如果有效,它必须是 4。

更改参数的数组大小以及sscanf 格式字符串中% 后面的数字以满足您的需要。

编辑: 如果输入有太多参数,要让它抛出错误,你可以这样做

#include <stdio.h>

int main()
{
  char input[60];
  char a1[2], a2[2], a3[2], a4[2];
  char temp[2];

  printf("Enter info");
  fgets(input, 60, stdin);
  if (4 != sscanf(input,"%1[^,\n], %1[^,\n], %1[^,\n], %1[^,\n] %1[^\n]", a1, a2, a3, a4, temp))
    return printf("Error"), 1;

  printf("%c %c %c %c", a1[0], a2[0],a3[0], a4[0]);
  return 0;
}

通过在sscanf 格式的末尾添加%1[^\n] 将尝试在四个参数之后读取另一个非空白字符。如果成功,则表示 ex:1,2,3,4,5 的输入参数过多。它将返回 5,这是它能够填充的数据数。但是,如果输入有效,则最后一个格式说明符不应匹配任何内容,因此sscanf 应在输入有效的情况下准确返回 4。

【讨论】:

  • 你的代码工作正常,但问题是如果我输入 a,b,c,d,e 它不会打印错误,只有当输入少于 4 个参数时
  • @MM1 对其进行了编辑以包括对其进行测试(未检查但应该可以)
  • 确实如此,你介意解释一下你到底做了什么吗?
  • @MM1 编辑成答案。
【解决方案2】:

问题在于%[ 格式说明符在使用字符序列时附加了一个空字符。

它需要有一个适当的char[] 类型的参数,能够至少包含字符加上空字符,但每个%[ 的相对参数在您的示例中仅为char 类型。

这会导致未定义的行为,因为附加的 \0 超出了数组的范围。

如果您想阅读和打印逗号分隔的单词,您可以使用:

#include <stdio.h>

int main()
{
  char input[60];
  char a1[15], a2[15], a3[15], a4[15];

  for(int i; i < 10; i++)
  {
      a1[i] = a2[i] = a3[i] = a4[i] = 0;  // Initialize each character with `\0`.
  }

  printf("Enter info\n");
  fgets(input, 60, stdin);
  sscanf(input,"%[^,\n],%[^,\n],%[^,\n],%[^\n]", a1, a2, a3, a4);


  printf("%s %s %s %s", a1, a2, a3, a4);
  return 0;
}

执行:

/a.out
hello,mister,tamborine,man
hello mister tamborine man

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 2016-02-13
    • 2013-01-06
    • 1970-01-01
    • 2021-06-30
    • 2016-08-19
    • 2013-04-07
    相关资源
    最近更新 更多