Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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语言中的sscanf函数_C_Scanf - Fatal编程技术网

C语言中的sscanf函数

C语言中的sscanf函数,c,scanf,C,Scanf,我正在使用我的C程序,我对如何使用sscanf函数有疑问 我必须从像something$HOME/something2这样的字符串中获取三个字符串:第一个字符串必须包含“something”,第二个字符串必须包含“HOME”,第三个字符串必须包含“/something2”。 但它还必须能够拆分$HOME或$HOME/something,或something$HOME 我写的是这样的: sscanf(str,"%m[^$]$%m[_a-zA-Z0-9]%*m", &an

我正在使用我的C程序,我对如何使用sscanf函数有疑问

我必须从像
something$HOME/something2这样的字符串中获取三个字符串:第一个字符串必须包含“something”,第二个字符串必须包含“HOME”,第三个字符串必须包含“/something2”。
但它还必须能够拆分
$HOME
$HOME/something
,或
something$HOME

我写的是这样的:

sscanf(str,"%m[^$]$%m[_a-zA-Z0-9]%*m", &ant, &act, &sig);
但是对于
$HOME
$HOME/something
something$HOME…
的情况,它需要非常奇怪的字符串。如果其他值不存在,我可以在我的sscanf上放置什么来获取NULL值呢?

很抱歉,但是你不应该为此使用
sscanf
。您的输入似乎是一个shell命令行参数,您似乎希望实现变量扩展

为此,您必须编写自己的解析器来解析表达式、识别并执行变量扩展。这不是scanf的工作,而是检查字符串中每个字符的自定义循环的工作


有一个名为
envsubt
的实用程序具有类似的功能。你可以检查一下。你也可以看看,;但是,
wordexp
函数是一个更广泛的函数。

sscanf
格式字符串不是正则表达式。如果需要正则表达式功能,则需要使用专用库。
“..%*m”
格式字符串末尾的字符被打断;在
m
之后需要一个
s
[…]
(扫描集)。您没有测试
sscanf()
中的返回值;它可能会告诉您出了什么问题,可能是返回EOF,也可能是需要返回3时只返回2。请注意,
sscanf()
转换规范都不接受空字符串,因此您无法通过调用
sscanf()
来处理“可能缺少的部分”。使用
sscanf()
的优点之一是,您可以在同一数据上尝试不同格式的字符串,直到找到一个可以根据需要解析数据的字符串。