2014-12-21 2 views
0

'유효성 검사'가 항상 true 인 경우 수신 할 인바운드 데이터를 삭제해도 비어있는 상태로 유지됩니다. cout 문을 사용하면 안됩니다.if (! buydat.empty()) 유효성 검사가 실패하면 true (항상 true)

코드 :

void buymngr(){ 
     vector<std::string> buydat; 
     vector<std::string> markdat; 
     vector<std::string> pricedat; 
     buydat = getmyData(); 
     if(!buydat.empty()){ 

       cout << "You 'do' have buy string match data!" << endl; 
     } 

그것은 데이터를

getmyData를 얻기위한 담당하는 기능 getmyData를 호출이 :

vector<string> getmyData() 
{ 
     FILE *mydfp = popen("php getMyorders.php", "r"); 
     if (mydfp == NULL) perror ("Error opening file"); 
     char mydbuff[BUFSIZ]; 
     vector<string> vrecords; 
     while(fgets(mydbuff, sizeof(mydbuff), mydfp) != NULL){ 
       size_t n = strlen(mydbuff); 
       //clean '\0' from fgets 
       if (n && mydbuff[n - 1] == '\n') mydbuff[n - 1] = '\0'; 
       if (mydbuff[0] != '\0') vrecords.push_back(mydbuff); 
     } 
     cout << "I got my own data" << endl; 
     return vrecords; 
} 

코드가 합법적으로 '진실', 그것은 잘 실행 모든 기능을 정상적으로 수행합니다. 하지만 false로 만들면 여전히 true 및 세그먼트 결함 (gdb는 특정 라인을 가리 키지 않지만 오류는 실제로는 존재하지 않는 유효한 데이터를 처리하려고 시도하는 것처럼 보임)의 유효성을 검사합니다.

+0

'벡터 '를 지우기 위해 무엇을 사용하고 있습니까? ['clear()'] 했습니까 (http://en.cppreference.com/w/cpp/container/vector/clear)? – IllusiveBrian

+0

벡터를 지우려고하지 않습니다. – mine

+0

오해가 아니라면, 빈 벡터에 대한'! buydat.empty()'의 테스트 케이스가 테스트를 위해 벡터를 지운 후에도 true를 반환한다고 말했습니까? 모든 벡터 데이터를 지우는 방법에 문제가있을 수 있습니다. 왜냐하면 나는'empty()'에 문제가 없다고 확신하기 때문입니다. – IllusiveBrian

답변

0

if 문은 b < buydat.size()을 확인합니다. "... 당신은 색인을 생성 할 수"내가 무슨 뜻인지 "당신은 인덱스 할 수 ..."였다 편집에

if (buydat[b] == "Buy"){ 
    pricedat.push_back(buydat[b+1]); 
} 

:이 문을 사용하여 벡터의 끝을 넘어 인덱스 할 수있다.
그것은 관찰 이었지만 제안이 아닙니다 : pricedat 벡터에 buydat[b+1]을 추가하고 있습니다. 테스트에서 (b == (buydat.size()-1)) 인 경우 push_back(buydat[buydat.size()] - 유효하지 않습니다. 을 그리고 그래서 대답은 후속, 너무 긴 코멘트

+0

내가 그렇게한다면, 나머지 코드 때문에() 루프를위한 // 내부의 몇 가지 함수로 끝납니다. 라이브 코드는 몇백 줄 더 있습니다. 가능하다면 사전 검증을하고 싶습니다. 그러나 당신의 아이디어에 대해 대단히 감사드립니다. – mine

+0

나는 buda.size에 관심이 없다. 이 함수는해야 할 일을 수행하지만 유효한 데이터로만 수행해야합니다. 내 실패는 -> if (! buydat [0] .empty()) {, 항상 true (buydat.size 이전)입니다. – mine

0

을 - (난 당신 for 루프에 따라 7 같은데요 무엇이든 N) 귀하의 게시 된 코드는 buydat.size() 미만 b+N가 있는지 확인하기 위해 어떤 검사를하지 않습니다 문제가 getMyData()에 있습니다.

#include <vector> 
#include <string> 
std::vector<std::string> getmyData() 
{ 
    std::vector<std::string> vrecords; 
    vrecords.push_back("anything."); 
    vrecords.push_back("anything 2."); 
    // push some more data here so the result -looks- like 
    // whatever you expect the output of your PHP to be. 

    // also, your original version of this function never closes mydfp 

    return vrecords; 
} 

void buymngr(){ 
    std::vector<std::string> buydat; 
    std::vector<std::string> markdat; 
    std::vector<std::string> pricedat; 
    buydat = getmyData(); 
    if(!buydat.empty()){ 
     std::cout << "You 'do' have buy string match data!" << std::endl; 
    } 
} 

int main() 
{ 
    buymngr(); 
    return 0; 
} 

확인 getMyorders.php의 출력 - 출력이 잘못되면, 음, 당신의 문제가있어 : 고려하십시오. 그렇지 않은 경우 getMyOrders.php의 출력을 게시하십시오.

+0

이 코드는 올바르게 작동합니다. 원시 데이터는 https://bpaste.net/show/106244fa62b8입니다. – mine

관련 문제