2016-04-13 80 views
-3

我相信我所做的一切都是正确的,但字符串没有被分配的字符填充。这是我通过测试得知的:random是正确的字符,q是正确的int,s [i] .name是一个字符串。我曾尝试使用.at(q)和[q],但没有任何工作。at()在函数中不起作用

这是我的错误:在 中止(核心转储)

for (int i = 0; i < num; i++) { 
    int q = 0; 
    char random = 50; 
    for (; random != 32;) { 
     file.get(random); 
     s[i].name.at(q) = random; 
     q++; 
    } 
    q = 0; 
} 
cout << s[0].name; 
+1

它看起来像(我),就像你试图给一个rval分配一个'char'(并且rval不存在)。 –

+1

根据你的逻辑,'q'可以比s [i] .name'具有更大的值。 –

回答

1

的basic_string ::如果是这样的:

扔 '的std :: out_of_range' 什么()的一个实例后终止叫所有的代码,它崩溃了,因为名字没有在任何地方分配内存。呼叫at要求至少有许多元素已经分配给它工作。尝试调用push_back来代替,这将在字符串的后面添加元素,并在必要时扩展它。

此外,for的最后一行是多余的,将q设置为0没有意义,因为它在下一行被破坏,并且新的q在下一个循环中被分配。更不用说,使用push_back时,跟踪q的索引变得完全多余。 最后,为了使事情变得不必要的复杂,在这种情况下使用。

+0

谢谢,我忽略了一个简单的错误。 – Dent

0

这是困难的,因为你没有给我们完整的代码,但如果我理解你的意图,你应该能够得到类似的东西与此:

for (int i = 0; i < num; i++) { 
    char random = 50; 
    s[i].name = ""; 
    for (; random != 32;) { 
     file.get(random); 
     s[i].name += random; 
    } 
} 
cout << s[0].name; 

如果字符串太短,at()会抛出异常。像我一样使用连接应该处理任意大的字符串。