在字符串数组中计数元素时出现分段错误

Segmentation fault during counting of elements in array of strings c++

本文关键字:分段 错误 元素 字符串 数组      更新时间:2023-10-16

我正试图解决在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;
}