c++模式将popen()输出与strcmp()匹配

c++ pattern matching popen() output with strcmp()

本文关键字:strcmp 匹配 输出 模式 popen c++      更新时间:2023-10-16

我使用popen()运行的脚本中有来自缓冲区的数据,在写入文件之前,我需要进行字符串比较(我知道strcmp是最好的)。

这就是我目前拥有的

#include <stdio.h>
#include <string.h>
#include <iostream>
int main()
{
        char key[] = "Order ID:";
        char buff[BUFSIZ];
        FILE *fp = popen("scriptfile.sh", "r");
        while (fgets( buff, BUFSIZ, fp)){
                if (!strcmp (key, buff)){
                        std::cout << "Match";
                }else{
                        printf("LS->%s", buff);
                        std::cout << "Good Bye Cruel World!";
                }
        }
        pclose(fp);
}

并没有错误,这里bpaste是运行数据的转储。请参阅"订单ID"的最后一行

if/else语句所做的与您认为的相反,因为strcmp()在匹配时输出0,所以只需在if语句中放置一个"!"运算符即可。

if (!strcmp (key, buff))
    std::cout << ".";

如果你想更详细地解释为什么会这样,请点击此处。

strcmp()检查是否完全相等。由于您正在查找key:value,因此无法使用strcmp检查新字符串是否以key开头。。。因为CCD_ 5将失败(除非CCD_。

所以不是:

if (strcmp(key, buff)) {

do:

if (strstr(key, buff) == buff) {

这将在buff中查找子字符串key,并返回它开始的指针,您希望它是buff

或者,既然你知道它必须从一开始:

if (!memcmp(key, buff, sizeof(key) - 1)) {

这只会检查内存中的字节。您需要在末尾使用- 1,因为您不想检查key的空字节。