通过循环将字符串对象添加到数组

时间:2010-03-02 17:17:38

标签: c++ arrays

我要做的是创建一个模板数组类,它将数据类型的值存储到数组中。我使用int值可以正常工作,但是使用字符串对象时,事情就会开始崩溃。

我已经取出了代码块并自行尝试了,我确实得到了同样的错误。我确信我已经学到了这一点,而且我几乎是肯定的,答案很简单,试图围绕我们学习c ++的速度,我有时会有点疯狂!

我现在最好的猜测是,我需要对字符串进行标记并寻找空格。我倾向于过度思考导致更多混乱的事情 - 因此我在这里寻求答案!

代码:

// Test String: Hello World this is a String Object
int stringSize = 7;
int count = 0;

string s[stringSize];

cout << "\nEnter " << stringSize << " one-word string values:\n";

while (count < stringSize) {

    string tmpVal;

    cin >> tmpVal;
    s[count] = tmpVal;

    count ++;
}

8 个答案:

答案 0 :(得分:1)

我对你正在寻找什么感到困惑,但我建议你查看标准库。

也许是这样的:

list<string> s;

然后,在循环中使用push_back。

答案 1 :(得分:1)

string s[stringSize];是非法的,因为stringSize不是常量。您必须使用动态内存(即string* s = new string [stringSize];),包括stringsize作为模板参数(不要这样做,它实际上没有解决问题),使用固定大小的值,或使用现有结构(我建议vector,就像比尔的回答一样)。下面的代码在我的编译器上工作正常:

int main(int argc, char *argv[]) {
int stringSize = 7;
int count = 0;
string* s = new string [stringSize];
cout << "\nEnter " << stringSize << " one-word string values:\n";
while (count < stringSize) {
    string tmpVal;
    cin >> tmpVal;
    s[count] = tmpVal;
    count ++;
    }
    delete[] s;
}

答案 2 :(得分:0)

为什么不读取整行,然后找到所有空格并使用substr方法,拆分字符串?

您需要以下方法: getline() find_first_of() substr()

此外,搜索此网站以在c ++中拆分字符串会给你很多提示。

答案 3 :(得分:0)

首先,数组的大小应该是常量:

const int stringSize = 7;

其次,正如dbrien所说,你应该使用std :: vector,除非你这样做是为了学习经验:

std::string tmpVal;
std::vector<std::string> s;
cout << "\nEnter " << stringSize << " one-word string values:\n"; 

while (cin >> tmpVal)
{ 
    s.push_back(tmpVal);
}

答案 4 :(得分:0)

首先,数组维度必须是常量,因此它应该是const int stringsize = 7;另外,我建议使用std :: vector而不是std :: list,另外还有什么错误?

答案 5 :(得分:0)

不确定你得到了什么错误,但这是错误的,因为你需要使用常量整数值来在堆栈上分配数组。更改:

int stringSize = 7;
int count = 0;

string s[stringSize];

......来:

const int stringSize = 7;
int count = 0;

string s[stringSize];

你可以也可能也应该使用向量而不是使用C风格的数组,或尝试手动滚动你自己的模板化数组类:

vector<string> s;
const int stringSize = 7;

cout << "\nEnter " << stringSize << " one-word string values:\n";

while (s.size()  < stringSize) {

    string tmpVal;

    cin >> tmpVal;
    s.push_back(tmpVal);
}

答案 6 :(得分:0)

我也很困惑你的实际问题是什么,因为你的代码有效。但是,FWIW,我建议如下。更改是:(1)使用const(已经由其他人建议),(2)使用size_t,(3)将变量名称stringSize更改为numStrings(因为这个我乍看之下很困惑),以及(4)避免字符串复制。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    const size_t numStrings = 7;
    size_t count = 0;

    string s[ numStrings ];

    cout << "\nEnter " << numStrings << " one-word string values:\n";

    while (count < numStrings) {
        cin >> s[ count ];
        count++;
    }

    return 0;
}

答案 7 :(得分:-2)

事实证明这是编译器。我正在使用xCode并获取:

cin_cout(7307) malloc: *** error for object 0x1000072c0: pointer being freed was not allocated

***在malloc_error_break中设置断点以进行调试

在Visual c + +中运行相同的块似乎没问题...对不起我的愚蠢并感谢所有快速反馈!