【发布时间】: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() 是个好主意,只是扫描有出了错,应该小心..