1

我在使用 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);

好的,如果我var_text cat | cut | sort在 cm1 return cat 中写入 cm2 return cut 和 cm3 return sort,但如果我写cat /etc/passwd | cut -f1 d: | sort,cm1 return cat 和 cm2 和 cm3 none...

我用c做了一个shell,我需要命令和属性

谢谢大家,抱歉英语不好:)

4

1 回答 1

4

%s格式说明符将在第一个空白字符处停止处理。如果是:

猫 /etc/passwd | 切-f1 d:| 种类

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

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

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

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

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

于 2013-01-10T15:53:13.023 回答