Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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_Parsing_Scanf - Fatal编程技术网

带管道C的sscanf

带管道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返回中写入变

我在使用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返回中写入变量文本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将分配内存