2014-10-31 2 views
1

У меня есть данные, поступающие из буфера из сценария, который я запускаю с помощью popen(), и мне нужно выполнить сравнение строк (я понимаю, что strcmp является лучшим) до написания в файл.C++ pattern matching popen() output with 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 свалка бегущих данных. см. последнюю строку для «Идентификатор заказа»

+2

Вы действительно хотите совместить полную строку чтения (включая новую строку!) С этим ключом, который выглядит только как первая часть строки? – Deduplicator

+0

Я думаю, что я ошибался и на \ n. –

ответ

2

Оператор if/else делает противоположное тому, что, по вашему мнению, делает, потому что strcmp() выводит 0, когда они соответствуют, поэтому просто поместите «!» оператора в инструкции if.

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

Go here, если вы хотите получить более подробное объяснение того, почему это происходит.

+0

все еще нет соответствия образца. Все «Прощай жестокий мир» и никакого периода ». –

+0

Я знал о 0 для bool yes/positive –

0

strcmp() проверяет на полное равенство. Поскольку вы ищете key:value, вы не можете использовать strcmp, чтобы проверить, не начинается ли ваша новая строка с key ... так как strcmp не удастся (если только value не имеет значения null).

Таким образом, вместо:

if (strcmp(key, buff)) { 

сделать:

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

Это будет искать подстроки key в buff и возвращает указатель, на котором он начинается, который вы хотели бы быть buff.

С другой стороны, так как вы знаете, он должен начать с самого начала:

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

Это будет просто проверить байт в памяти. Вам нужно - 1 в конце, так как вы не хотите проверять нулевой байт key.

+0

Можете ли вы рассказать о своем ответе, возможно, фрагменте кода? Да, я действительно пытаюсь сделать ключ: запрос значения из входящего JSON –

+0

@ user3766148 Переписал его. – Barry

+0

ошибка: ISO C++ запрещает сравнение между указателем и целым числом? Должен ли я конвертировать в деци? –