2010-03-02 115 views
0

我想要做的是创建一个模板数组类,它将数据类型的值存储到数组中。我使用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 ++; 
} 
+1

有什么错误? – 2010-03-02 17:21:39

+1

“我已经取出了代码块,并尝试使用它自己的代码,我确实得到了同样的错误。” - 也许你可以告诉我们错误是什么。 – 2010-03-02 17:22:00

+0

我没有得到上述代码的任何错误。它会帮助你若* *规定的错误,你越来越... – DevSolar 2010-03-02 17:25:08

回答

1

string s[stringSize];是非法的,因为stringSize不是一个常量。您必须使用动态内存(例如string* s = new string [stringSize];),将字符串大小作为模板参数(不要这样做,它实际上不能解决问题),使用固定大小的值或使用现有结构(我建议vector,如Bill的答案)。下面的代码工作正常在我的编译器:

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; 
} 
+0

字符串s [7]是完全有效的。它声明了一个由7个字符串组成的数组 string s [val]在gcc上有效,它允许动态调整大小的堆栈数组;他的问题是,他做了数组大小固定,它应该是一个矢量 – pm100 2010-03-02 17:42:48

+0

@ PM100:'字符串s [大小]'是因为编译器扩展的只有GCC有效。正如OP发现的,它不是可移植的代码。 'const int size = 7; string s [size];'是有效的C++,假设向量不是正确的解决方案。 – Bill 2010-03-02 17:52:39

+0

那就是我说的。布赖恩说,字符串s [stringSize]是无效的,因为's是一个动态字符串',没有它的不是,它是一些平台上的字符串数组,并且不会在其他平台上编译。也许他的意思是'动态字符串数组' – pm100 2010-03-02 20:16:35

1

我为你寻找什么有点困惑,但我建议寻找到标准库。

也许是这样的:

list<string> s; 

,然后,在循环使用的push_back。

0

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

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

此外,围绕这个网站在C分割字符串++会给你很多提示的搜索。

+0

进出口使用的模板类,所以我想避免分裂串 – cdnicoll 2010-03-02 17:33:29

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); 
} 
0

首先,阵列尺寸必须是恒定的,所以它应该是const int的stringsize的= 7;另外,我会建议使用std :: vector而不是std :: list,另外什么是错误?

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); 
} 
-2

因此,原来它是编译器。我使用Xcode和越来越:

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

***设置malloc_error_break断点调试

运行在Visual C同一块++似乎是确定...对不起,我的愚蠢和感谢慈祥所有的快速反馈!

+4

请编辑您自己的帖子,而不是提供答案。 – 2010-03-02 17:38:32

0

,我也搞不清楚什么是您的实际问题,因为你的代码工作。但是,FWIW,我会建议如下。的变化是:(1)使用常量(已经被别人所建议的),(2)使用的size_t的,(3)的变量名stringsize的的变化(I在第一眼混淆,因为这一点)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; 
}