在字符串数组中计数元素时出现分段错误
Segmentation fault during counting of elements in array of strings c++
我正试图解决在topcoder上发现的一个老问题。我立即被困在试图找到字符串数组中的元素数量。这是我的代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;
class MiniPaint {
private:
size_t numLines;
public:
int leastBad(string picture[], int maxStrokes) {
numLines = 0;
while (!picture[numLines].empty()) {
numLines++;
}
cout << numLines << 'n';
return 0;
}
};
int main() {
MiniPaint instance;
string picture[] = {"BBBBBBBBBBBBBBB", "WWWWWWWWWWWWWWW", "WWWWWWWWWWWWWWW", "WWWWWBBBBBWWWWW"};
instance.leastBad(picture, 10);
return 0;
}
这段代码给了我一个分段错误。有些地方出了问题,代码对于计算元素数量的功能来说有点过多,但当然我想扩展这个类来包含更多的功能。如果有人能解释什么是错的,我将不胜感激!提前谢谢。
编辑:当我用 展开代码时 cout << picture[numlines] << 'n';
在while循环中,为了显示数组中的实际元素,首先显示四个合适的字符串,然后以某种方式无休止地将空格打印到终端。所以问题就在于
picture[4].empty()
不返回true,即使picture只有四个元素
您的while
循环条件假设数组中的最后一个字符串为空:
int leastBad(string picture[], int maxStrokes) { numLines = 0; while (!picture[numLines].empty()) {
但是在main()中定义的输入字符串数组是而不是以空""
字符串结尾的。
所以你可能想添加这个空字符串结束符:
// inside main()
string picture[] = {..., "" /* Empty string terminator */ };
此外,在现代c++中,我鼓励您使用数组容器类而不是原始的C风格数组,通常是std::vector<std::string>
。
在这种情况下,您可以使用size()
方法来获取数组大小(即元素计数),或者仅使用range-for循环来遍历整个数组。
你越界访问数组
当你调用picture[4]
时,你想访问一个不存在的字符串对象,结束对函数empty()
的调用是在未初始化的内存中。
你要么需要存储数组的大小并迭代到numLines<=3
,要么你可以使用vector
std::vector<std::string> picture = ...
for(std::string line : picture)
{
//do stuff
}
您超出了picture[numLines]
的数组边界。您应该传递数组长度或计算它并检查索引numLines
。代码看起来像:
size_t length = sizeof(picture) / sizeof(*picture); // For VS use _countof macro
while (numLines < length && !picture[numLines].empty())
{
++numLines;
}
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?