2016-09-15 2 views
1

현재 "가변 함수"를 사용하고 문자열 벡터에 4 개의 이름을로드 한 다음 인쇄하려고합니다. 내가 'int'형식으로 이것을 사용하고 숫자를 사용하면 잘 작동하지만 문자열 벡터를 사용할 때 오류가 발생합니다."벡터 첨자가 범위를 벗어났습니다."오류가 발생했습니다.

#include "stdafx.h" 
#include<cstdio> 
#include<cstdarg> 
#include<string> 
#include<vector> 
#include<iostream> 
using namespace std; 



int count; 

vector<string> namesVector; 

void names(int count, ...) 
{ 
    va_list namesList; 

    int i; // for loop 

    va_start(namesList, count); 

    for (i = 0; i < count; i++) 
    { 
     string currentElement; 
     currentElement = va_arg(namesList, string); 

     namesVector[i] = currentElement; 

    } 

    va_end(namesList); 
} 


int main() 
{ 
    int nameCount = 4; 

    names(nameCount,"jon", "maggie", "joan", "alfred"); 

    for (int i = 0; i < nameCount; i++) 
    { 
     cout << "Name at element " << i << " is: " << namesVector[i] << endl; 
    } 

} 
+1

그것은 소리. 좋은 디버거를 사용하면 한 줄씩 프로그램을 실행하고 예상 한 곳에서 벗어난 곳을 볼 수 있습니다. 프로그래밍을 할 때 필수적인 도구입니다. 추가 읽기 : ** [작은 프로그램을 디버깅하는 방법] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** –

+0

시간을 투자하는 것이 좋습니다. 'std :: vector'가 어떻게 동작하는지 (http://en.cppreference.com/w/cpp/container/vector). – caps

답변

3

C++에서는 가변 인수로 쉽게 복사 할 수있는 유형 만 사용할 수 있습니다. std::string은 NULL 종료 버퍼를 가리키는 char* 포인터에서 구성 할 수 있으므로 std::string 형식 대신 char*을 사용할 수 있습니다. 그냥 코드에서

currentElement = va_arg(namesList, char*); 

currentElement = va_arg(namesList, string); 

를 교체합니다. 이 제한을 제거하려면 사용하는 모든 유형에 대해 컴파일 타임에 코드를 생성하는 variadic templates을 고려하십시오.

코드에도 런타임 오류가 있습니다.

namesVector[i] = currentElement; 

은 벡터에 메모리를 할당하지 않았을 때 프로그램을 중단시킬 가능성이 큽니다. 벡터는 실제로 동적 배열이므로 size 인수를 적절한 생성자에 전달하거나 벡터에서 resize을 호출해야합니다. 당신이 경우에 당신은 어느 쪽을, 그러나 다만 push_back method을 사용할 수 있습니다 : 당신이 당신의 코드를 단계별로 디버거를 사용하는 방법을 배울 필요가 있습니다처럼

namesVector.push_back(currentElement); 
+0

정말 고마워! 그걸 고쳤고 설명 해줘서 고마워! – JSan782

관련 문제