【问题标题】:how to parse three comma separated strings from terminal using fgets()/sscanf()如何使用 fgets()/sscanf() 从终端解析三个逗号分隔的字符串
【发布时间】:2015-02-03 06:13:49
【问题描述】:

阅读Parsing a comma separated file using C using fscanf() 后,我取得了一些进展,但我仍然难以解析。

来自控制台的输入预计最多为三个字符串,以逗号分隔,例如"String1,String2,String3" 或 "String1,String2" 或 "String1"

我可以在完成这项工作后处理输入验证。我需要将此输入解析为三个单独的 char* 字符串。

到现在为止

char arg1[9] = "UNDEF";
char arg2[17] = "UNDEF";
char arg3[33] = "UNDEF";
char inputBuffer[100];

char* end = "END";

while(strcmp(arg1, end) != 0)
{
  printf("ENTER INSTRUCTION:");
  fgets(inputBuffer, sizeof(inputBuffer), stdin);
  sscanf(inputBuffer, "%[^,\n]s,%[^,\n]s,%s" arg1,arg2,arg3);
  printf("arg1: %s\narg2: %s\narg3: %s\n", arg1,arg2,arg3);
}

但是当我从终端输入"test,test,test" 运行它时,它会输出

arg1: test
arg2: UNDEF
arg3: UNDEF

很明显我做错了什么,但我不知道是什么……这对我来说是新的领域;自从三年前的两个学期的 c++ 课程以来,我从来没有用 C 写过,也没有写过 C++。

【问题讨论】:

  • code标签吃引号了吗? sscanf(inputBuffer, "%[^,\n]s,%[^,\n]s,%s, arg1,arg2,arg3);
  • fscanf()吗? fgets()strtok() 可以以更优雅和灵活的方式完成这项工作。 [应该是sscanf()]
  • 呃 ...我需要更改标题,我正在使用 fgets()/sscanf() ... strtok() 的行为与 sscanf() 有何不同?
  • strtok() 行为不会有所不同,相反,它会以一种相当结构化的方式为您提供预期的 o/p。我个人不喜欢用scanf()family,fgets()strtok()对我来说是更好的组合。你喜欢另一种方法吗?否则我的回复在这种情况下没有任何意义。
  • @SouravGhosh 我不明白为什么建议使用 strtok(),因为它修改了输入字符串,而且 OP 的代码也很好 fgets() 后跟 sscanf() 是个好主意,只是扫描有出了错,应该小心..

标签: c scanf


【解决方案1】:

摆脱s

sscanf(inputBuffer, "%[^,\n],%[^,\n],%s", arg1,arg2,arg3);

[^,\n] 将扫描直到 , 被找到并将扫描的值存储在您的 char array 中。

PS:fgets() 带有换行符。

【讨论】:

  • 我以为 fgets() 吃了换行符,但是当我与 END 比较时,除非后跟逗号,否则它不起作用,但是当我将 \n 添加到它起作用的表达式时......我认为 sscanf() 正在接受换行符并附加它,所以它是 END\n ...实际上,当我删除 \n 时查看控制台输出,这正是发生的事情。所以我猜我原来的意思是 ?
  • @DanielBall 您需要通过执行if(a[strlen(a)-1] == '\n') a[strlen(a) -1] = '\0' 来抑制换行符,然后您的缓冲区中没有\n。后面你应该说 read until comma is enountered,正确的说法如上所示。另一件事是始终检查 sscanf() 的返回值,这将非常有帮助
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 2015-05-24
  • 2019-12-04
  • 1970-01-01
  • 2020-01-08
  • 2021-12-27
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多