C ++ char / string读取问题

时间:2011-07-07 10:12:05

标签: c++

同样,我正在尝试制作一个简单的程序。它将读取某种类型的板,大小与RxC相同。板上的每个项目都是字母,用空格分隔。这是一个示例板:

A B C
D E F
G H I

之后,它将读取一个整数N,对于接下来的N行,读取一个字符串并根据给定的电路板逐个处理它们。但现在,我正面临着如何阅读它们的问题。这是代码:

#include<iostream>
using namespace std;

int r,c,el; char **arr;

int main()
{
    char *tes;
    int n;

    //start reading the puzzle
    cin >> r >> c; el=r;
    cout << el << endl;
    arr = new char * [3*(r+c)-6];
    for(int i=0;i<r;i++)
    {
        arr[i] = new char[c+1];
        for(int j=0;j<c;j++) cin >> arr[i][j];
        arr[i][c] = '\0';
    }
    for(int i=0;i<el;i++) cout << arr[i] << endl;

    cin >> n;
    while(n>0)
    {
        n--;
        cin >> tes;
        cout << tes << endl;
    }
}

我不知道这有什么问题,对我来说似乎没问题。但是,它总是会出现运行时错误。我正在使用最新的MinGW和gdb调试器。在gdb上我看到了类似

的内容
  

“接收信号SIGSEGV。分段   故障“

,并出现0xC0000005错误。我真的不知道这里发生了什么。我已经尝试了iostream(cin&amp; cout)和cstdio(scanf,puts等)

P.S。:我全局声明变量,因为我将在main()函数的不同函数上处理它们。我将数组的“高度”的大小设置为(3 *(r + c)-6),而不是正常(r),因为我将使用相同的数组来存储另一个字符串。

4 个答案:

答案 0 :(得分:3)

大小为R * C的电路板需要r*c char存储,而不是非常令人惊讶。我不明白你为什么要分配这么多步骤。一个char* board = new char[r * c];应该这样做,然后跟踪您正在阅读的数组中的位置。

答案 1 :(得分:3)

除了其他人已经注意到的问题之外,你还没有为tes分配任何内存 - 它只是一个悬空指针。

变化:

char *tes;

到,例如:

char tes[80];

答案 2 :(得分:2)

分段错误通常意味着您正在尝试访问尚未分配的内存,例如

char* mystr = (char*)malloc(3*sizeof(char));
mystr[4] = 0.0;

会(很可能)导致seg错误,因为你正在访问你没有分配的内存(mystr从0 - 2开始)。

您确定要正确分配内存吗?我不知道为什么你有3 *(r + c)-6。

答案 3 :(得分:0)

unwind的答案之后,您的数组的大小为3*(r+c)-6,但是您正在循环使用值i = 0; i < r;,这取决于值可能超出范围(加上它)毫无意义)。