2013-11-28 4 views
0

목록에 문자 배열을 입력하려고합니다. 이것은 내가 지금까지 가지고있는 것입니다.배열/포인터 목록 C++

list<char*> l; 
char str[50]; 

cout<<"Enter strings. 0 to stop:\n"; 
while(1) 
{ 
    cin >> str; 
    if(strcmp(str, "0") == 0) 
     break; 

    l.push_back(str); 
} 

list<char*>::iterator p; 

// display 
for(p = l.begin() ; p != l.end(); p++) 
    cout<<*p<<endl; 

디스플레이 루프는 마지막으로 입력 된 문자열을 n 번만 표시합니다. 배열 목록을 나타내는 더 좋은 방법이 있습니까?

+0

배열을 C++로 복사 할 수 없기 때문에 배열 목록은 허용되지 않습니다. 당신은 똑같은 것이 아닌 포인터 목록을 가지고 있습니다. – john

답변

3

정확히 무엇을 요청 했나요? 귀하의 목록은 char*의 배열이며 매번 동일한 주소를 제공합니다. 해당 주소에있는 것은 루프를 통해 매번 변경됩니다 ...

... 그리고 함수에서 해당 목록을 반환하는 것에 대해 생각조차하지 마십시오. 목록의 주소는 함수 호출 범위에서만 유효합니다.

당신은 문제는 항상 같은 버퍼 str를 가리키는 것입니다 std::list<std::string>

1

같은 더 나을 것 : 서로 다른 값을 포함하는 목록을 원하는 경우, 당신은 각각 다른 버퍼가 필요합니다 기입. 물론 이것은 신속하게 관리하기 어려워집니다. 따라서, 당신은 우리의 목록에 std::string 객체를 포함 떨어져 훨씬 더 있습니다

std::list<std::string> l; 
for (std::string tmp; std::cin >> tmp;) { 
    if (tmp == "0") { 
     break; 
    } 
    l.push_back(tmp); 
} 

주 당신이 그것은 또한 매우 위험 할로 std::cin >> str;를 사용 : 버퍼 오버 플로우의 입력을 방지 아무것도 없다! 당신은 물론,

if (std::cin >> std::setw(sizeof(str)) >> str) { 
    // ... 
} 

을 그리고 : 당신이 char 버퍼 입력 연산자를 사용 경우 , 스트림의 width() 버퍼의 크기 (std::setw()<iomanip>에 선언) 그렇게하기 전에 사용자가 설정하기 각 입력 후에 실제로 성공했는지 확인해야합니다.