我在使用sscanf
解析c时遇到问题我在控制台上阅读了一个名为read_line()
的函数char cm1[100],cm2[100],cm3[100]
printf("Enter command:");
read_line(var_text);
/*var_text = cat /etc/passwd | cut -f1 d: | sort */
int num = sscanf(var_text,"%s | %s | %s",cm1,cm2,cm3);
好的,如果我在cm1中的var_text cat | cut | sort
中写回cm2中的返回切换并且在cm3中返回排序,但如果我写cat /etc/passwd | cut -f1 d: | sort
,则cm1返回cat和cm2并且cm3 none ...
我在c中制作了一个shell,我需要命令和属性
对所有人来说,并且抱歉那个糟糕的英语:)
答案 0 :(得分:4)
%s
格式说明符将停止在第一个空格字符处理。在以下情况下:
cat / etc / passwd | cut -f1 d:|排序
它将是第一个cat
结束的%s
之后的空格。然后格式说明符期望|
不存在,并且cm2
和cm3
未填充。您可以使用扫描集来实现此目的:
if (3 == sscanf(var_text, "%99[^|]| %99[^|]| %99s", cm1, cm2, cm3))
{
}
注意使用宽度说明符来防止缓冲区溢出并检查sscanf()
的返回值以确保填充所有目标变量。
格式说明符%99[^|]
表示最多读取99个字符(比目标缓冲区大小少一个,以容纳空终止符),直到遇到|
个字符。
请参阅http://ideone.com/Cz1Qef上的演示。