2014-10-31 3 views
1

나는 popen()을 사용하여 실행 한 스크립트에서 버퍼로부터 데이터를 가져오고 문자열 비교를 수행한다. (strcmp가 최고라고 이해한다.) 쓰기 전에 파일로.strcmp()와 함께 출력되는 C++ 패턴의 popen() 출력

이것은 bpaste가 실행중인 데이터의 덤프 여기, 내가 지금까지

#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); 
} 

없음 오류가없는 것입니다. 마지막 줄의 'Order ID'참조

+2

전체 읽기 문자열 (줄 바꿈 포함)을 줄의 첫 번째 부분처럼 보이는 해당 키와 비교 하시겠습니까? – Deduplicator

+0

나는 내가 \ n에 대해서도 오류가 있다고 생각한다. –

답변

2

strcmp()는 일치 할 때 0을 출력하기 때문에 if/else 문은 사용자가 생각하는 것과 반대의 행동을하기 때문에 "!" 연산자를 if 문에 추가합니다. 이는 이유에 대한 자세한 설명을 좋아하면

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

이동 here.

+0

여전히 일치하는 패턴이 없습니다. 모든 '안녕 잘가 세계'와 마침표 없음. ' –

+0

bool yes/positive에 대해 0을 알았습니다. –

0

strcmp()은 완전한 평등을 검사합니다. key:value을 찾고 있으므로 을 사용하여 새 문자열이 key ...으로 시작하는지 확인할 수 없습니다. 이후 strcmp이 실패합니다 (value이 null이 아닌 경우).

그래서 대신

:

if (strcmp(key, buff)) { 

는 수행

if (strstr(key, buff) == buff) { 
buff에 문자열 key을 찾아 당신이 buff 싶습니다이 시작하는 포인터를 반환합니다

. 또한

, 당신은 처음부터 시작해야합니다 알고 있기 때문에 : 단지 메모리에 바이트를 확인합니다

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

. key의 null 바이트를 확인하고 싶지 않으므로 끝에 - 1이 필요합니다.

+0

대답을 설명 할 수 있습니까, 코드 스 니펫일까요? 예, 실제로 키를하려고합니다. 인바운드 JSON에서 값 쿼리 –

+0

@ user3766148 다시 작성했습니다. – Barry

+0

오류 : ISO C++은 포인터와 정수를 비교하지 않습니까? 나는 deci로 변환해야합니까? –