带管道C的sscanf
我在使用sscanf进行c解析时遇到问题 我在控制台上通过一个名为read_line的函数读取文本带管道C的sscanf,c,parsing,scanf,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返回中写入变
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返回中写入变量文本cat | cut | sort,在cm2返回中写入cat,在cm3返回中写入cat/etc/passwd | cut-f1 d:| sort,在cm1返回中写入cat,在cm3返回中写入cm2和cm3 none
我用c做了一个外壳,我需要命令和属性
谢谢大家,很抱歉英文不好:在第一个空白字符处%s格式说明符将停止处理。在下列情况下:
cat/etc/passwd|cut-f1 d:|排序
第一个%s将在cat之后的空间结束。然后,格式说明符需要一个不存在且未填充cm2和cm3的|。您可以使用扫描集来实现这一点:
if (3 == sscanf(var_text, "%99[^|]| %99[^|]| %99s", cm1, cm2, cm3))
{
}
注意:使用宽度说明符防止缓冲区溢出,并检查sscanf的返回值,以确保填充了所有目标变量
格式说明符%99[^ |]表示读取最多99个字符,比目标缓冲区大小小一个,以容纳空终止符,直到遇到|个字符为止
请参见演示。第一个空格字符处%s格式说明符将停止处理。在下列情况下:
cat/etc/passwd|cut-f1 d:|排序
第一个%s将在cat之后的空间结束。然后,格式说明符需要一个不存在且未填充cm2和cm3的|。您可以使用扫描集来实现这一点:
if (3 == sscanf(var_text, "%99[^|]| %99[^|]| %99s", cm1, cm2, cm3))
{
}
注意:使用宽度说明符防止缓冲区溢出,并检查sscanf的返回值,以确保填充了所有目标变量
格式说明符%99[^ |]表示读取最多99个字符,比目标缓冲区大小小一个,以容纳空终止符,直到遇到|个字符为止
请参见演示。您可以使用sscanfvar|u文本,%m[^ |]|%m[^ |]|%ms、&cm1、&cm2、&cm3;这样可以避免缓冲区溢出的问题。cmx应该定义为char*,不要忘记释放memory@MohamedKALLEL,我不熟悉%m,在C99标准中找不到它。它是编译器扩展吗?它不是对所有gcc版本都有效。有关详细信息,请参阅以下链接:使用%m时,sscanf将分配内存。您可以使用sscanfvar_文本,%m[^^]|%m[^^]|%ms、&cm1、&cm2、&cm3;这样可以避免缓冲区溢出的问题。cmx应该定义为char*,不要忘记释放memory@MohamedKALLEL,我不熟悉%m,在C99标准中找不到它。它是编译器扩展吗?它不是对所有gcc版本都有效。有关详细信息,请参阅以下链接:使用%m时,sscanf将分配内存