2016-09-15 68 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++只允许使用trivially-copyable类型作为可变参数。由于std::string可从char*指针指向空终止的缓冲区来构建,因此您可以使用char*而不是std::string类型。只是

currentElement = va_arg(namesList, char*); 
在你的代码

更换

currentElement = va_arg(namesList, string); 

。要摆脱这种限制,请考虑variadic templates,它会在编译时为您使用的任何类型生成代码。

您的代码还包含运行时错误。这:

namesVector[i] = currentElement; 

很可能会崩溃你的程序,因为你没有在向量中分配任何内存。向量实际上是动态数组,因此您应该将大小参数传递给适当的构造函数,或者在矢量上调用resize。在你情况下,你可以这样做既不的,但只使用push_back method

namesVector.push_back(currentElement); 
+0

非常感谢!修复它并感谢解释! – JSan782