带管道的sscanf C.

时间:2013-01-10 15:49:34

标签: c parsing scanf

我在使用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,我需要命令和属性

对所有人来说,并且抱歉那个糟糕的英语:)

1 个答案:

答案 0 :(得分:4)

%s格式说明符将停止在第一个空格字符处理。在以下情况下:

  

cat / etc / passwd | cut -f1 d:|排序

它将是第一个cat结束的%s之后的空格。然后格式说明符期望|不存在,并且cm2cm3未填充。您可以使用扫描集来实现此目的:

if (3 == sscanf(var_text, "%99[^|]| %99[^|]| %99s", cm1, cm2, cm3))
{
}

注意使用宽度说明符来防止缓冲区溢出并检查sscanf()的返回值以确保填充所有目标变量。

格式说明符%99[^|]表示最多读取99个字符(比目标缓冲区大小少一个,以容纳空终止符),直到遇到|个字符。

请参阅http://ideone.com/Cz1Qef上的演示。