2010-05-21 6 views
8

편집 : 제임스 홉킨 (James Hopkin)의 제안을 구현 한 후에도 이상한 문자보다 훨씬 좋은 "잘못된 이름 'null'"이라는 경고가 표시됩니다. 그런 다음 라이브러리 문서를 다시 읽고 그 특정 함수에 대해 인수에는 aNames의 크기보다 NULL이 아닌 하나 이상의 요소가 있어야합니다. 추가 문자열에는 다른 용도가 있습니다. 문자열을 한 개 더 추가하면 코드가 제대로 실행됩니다. 제 잘못이고, 너무 유감입니다.문자열의 벡터를 foo (char const * const * const)에 전달하는 방법은 무엇입니까?

원본 게시물 :

안녕하세요,

이 내 첫 번째 게시물이 너무 좋은 주시기 바랍니다있다. 이 포럼에서 검색하고 봤지만 여전히 답을 찾을 수 없습니다. 이 문제로 하루 이상 나를 괴롭 히므로 제게 도움을주십시오. 고맙습니다.

문자열 함수의 벡터를 라이브러리 함수 foo (char const * const * const)에 전달해야합니다. 문자열에 대한 포인터이기 때문에 & Vec [0]을 전달할 수 없습니다. 따라서 배열이 있고 해당 배열에 c_str() 전달하십시오. 나는 위의 코드를 실행하면

는 다음 함수 foo가에 대한 몇 가지 경고를 던져 :

const char* aR[aNames.size()]; 

std::transform(aNames.begin(), aNames.end(), aR, 
       boost::bind(&std::string::c_str, _1)); 
foo(aR); 

그러나, 몇 가지 정의되지 않은 동작이 발생 같다 : 다음은 내 코드입니다 (aNames은 문자열의 벡터이다) 불법 문자 ('èI'blablabla)가 있습니다. 나는이 같은 함수 foo 전에 AR을 인쇄 할 경우

는 :

std::copy(aR, aR+rowNames.size(), 
      std::ostream_iterator<const char*>(std::cout, "\n")); 
foo(aR); 

그런 다음, 다 괜찮습니다. 내 질문 :

  1. 변환으로 인해 정의되지 않은 동작이 발생합니까? 그렇다면 왜?

  2. 문자열의 벡터를 foo (char const * const * const)로 전달하는 올바른 방법은 무엇입니까?

답변

1

글쎄, 나에게 맞는 것 같습니다. c_str는 다음에 비 const 문자열 연산이 될 때까지 상수 인 char의 null로 끝나는 배열을 생성합니다. const char * 배열에 c_str 포인터를 저장합니다.

나는 전문가가 아니기 때문에 문제가있을 수 있지만, 내 생각에 벡터의 문자열이 foo 함수에서 예상 한 것과 호환되지 않는 인코딩에 있습니다.

인코딩 관점에서 코드를 확인하십시오.

포인터 만 소요 foo 때문에 my2c

5

, 내 추측은 null로 끝나는 배열을 필요로한다는 것이다. aR에 대한 추가 요소를 할당하고 NULL을 할당하십시오.

나의 제안은 다음과 같습니다

std::vector<const char*> c_strings; 
c_strings.reserve(aNames.size() + 1); 

std::transform(
    aNames.begin(), aNames.end(), 
    std::back_inserter(c_strings), 
    boost::bind(&std::string::c_str, _1) 
    ); 

c_strings.push_back(0); 
foo(&c_strings[0]); 
+0

+1 좋은 생각. 실제로'foo' 함수의 배열 크기를 찾는 유일한 방법은 NULL 포인터를 찾는 것입니다. –

+0

네, 잘 됐네요! foo 함수의 서명이 진짜가 아닌 한. @ user347208 : 정확한 함수 서명입니까? – neuro

+0

도움 주셔서 대단히 감사합니다! @neuro : 정확한 함수 서명은 int foo (const char * filename, char const * const * const rowNames, char const * const * const columnNames)입니다. 그러나, 제 에디션에서 말했던 것처럼, 저는 신중하게 문서를 읽지 않아서 유감입니다. 시간 낭비입니다. 어쨌든, 모두 도와 줘서 고마워! – EXP0

1

이 시도 :

std::vector<char*> arr(aNames.size()+1); 
for(size_t i = 0; i < aNames.size(); ++i) 
    arr[i] = aNames[i].c_str(); 
arr[arr.size()-1] = NULL; // just in case 
foo(&arr[0]); 
+1

컴파일되지 않음 -'c_str'은'const char *'를 반환합니다. –

+0

Ok. "const char *"요소를 포함하도록 벡터를 변경하면 지금 컴파일됩니다. –

관련 문제