Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中使用带有两个不同分隔符的scanf解析字符串_C - Fatal编程技术网

在C语言中使用带有两个不同分隔符的scanf解析字符串

在C语言中使用带有两个不同分隔符的scanf解析字符串,c,C,正在尝试分析具有两个不同分隔符的字符串。 一个空格,后跟2个逗号,后跟一个空格/换行符 scanf("%s%[^,]s%[^,]s%s", v1, v2, v3, v4); 出于某种原因,向stdin写入一个以“abc asc,abc abc”分隔的字符串将为v1和v2生成正确的结果。但是v3和v4的垃圾结果 原因可能是什么 编辑: 这是完整的代码 char v1[MAX_LENG], v2[MAX_LENG], v4[MAX_LENG], v3[MAX_LENG]; scanf("%s%[

正在尝试分析具有两个不同分隔符的字符串。 一个空格,后跟2个逗号,后跟一个空格/换行符

scanf("%s%[^,]s%[^,]s%s", v1, v2, v3, v4);
出于某种原因,向stdin写入一个以“abc asc,abc abc”分隔的字符串将为v1和v2生成正确的结果。但是v3和v4的垃圾结果

原因可能是什么

编辑: 这是完整的代码

char v1[MAX_LENG], v2[MAX_LENG], v4[MAX_LENG], v3[MAX_LENG];

scanf("%s%[^,]%[^,]%s", v1, v2, v3, v4);
printf("%s%s%s%s", v1, v2, v3, v4);
它会打印出来 读一本�

使用以下命令:

"%s %[^,], %s %s"
输出:

$ gcc -Wall main.c
$ ./a.out
abc def, hij klm   <<<<< Input
abc
def
hij
klm
$gcc-Wall main.c
美元/年
abc def、hij klm呼叫:

将第一个字符串(空格、制表符等)读入
v1
;然后,它将第二个字符串(包括前导空格)读入
v2
,最大为一个逗号。然后失败,因为下一个字符是逗号,但代码正在扫描
s
。扫描集符号为
%[…]
%[^…]
;它不是
s
转换的修饰符;它是非常独立的,在
]
处完成。因此,读取前两个字段;然后转换失败。所以,
scanf()
返回2-但您没有注意到这一点。您必须始终检查来自
scanf()
(或任何输入函数)的返回,以确保得到预期的结果

请注意,仅在扫描集之后删除
s
不是一个完整的解决方案。下一个字符是逗号,因此第二个
%[^,]
扫描集将失败;你必须提供一些东西来读逗号。你重复了“
s
after scan set”错误,但是如果这也被修复了,那么你就有了战斗的机会

但是,您的输入声称为:

abc asc, abc abc
这里只有一个逗号。因此,要分析它,您需要使用:

if (scanf("%s %[^,] , %s %s", v1, v2, v3, v4) != 4)
    …something went wrong…
扫描集之前的空白跳过任何前导空白(三种转换
%c
%n
%[…]
不跳过前导空白;所有其他转换都跳过前导空白)。 所有其他空白都可以省略而不改变行为(并且在逗号文字之前省略空白是一个好主意,正如我所说的,但正如我所说,在它之前没有空白,至少只要那些阅读代码的人有足够的经验来了解它意味着什么)。 当涉及到错误报告时,如果您阅读整行代码(或者POSIX),则会容易得多
)然后用
scanf()
解析。通过这种方式,很好的错误报告变得容易多了。

%s%[^,]s%[^,]s%s
-->
%s%[^,],%s%[^,],“
?目前,您发布的代码不可能编译。你能把你实际使用的代码剪贴一下吗?在这种情况下,我们必须知道我们正在逐字查看您的代码,而现在我们显然没有。编辑文章并添加代码在打印值之前检查
scanf
的返回值。我已经这样做了,返回值是2。我不明白为什么它读取的内容不超过2条,即“
”%[^,],“
”%[^,],“
放置空间-它混淆了对
”,“
消耗量的审查。然而,正如你所说,“所有其他空白都可以省略……”。我猜是
“%[^a\u single\u char]a\u single\u char”
这个成语看起来很好,可以避免破坏。
if (scanf("%s %[^,] , %s %s", v1, v2, v3, v4) != 4)
    …something went wrong…