2011-07-07 284 views
0

再次,我试图做一个简单的程序。它会读取RxC大小的某种板子。板上的每个项目都是字母,用空格分隔。这是一个示例板:C++字符/字符串读取问题

ABC
DEF
GHI

在此之后,它将读取的整数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。分割 故障”

和0000005错误。我真的不知道这里发生了什么。我已经尝试了两个iostream(cin & cout)和cstdio(scanf,puts等)。

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

+1

太多'<<' and '>>'和其他奇怪的是,这是c。标签已移除。 – pmg

+2

嘿,既然你在学习C++,或许我们可能会对你感兴趣的是我们的一个时髦的自我管理容器类,比如'std :: vector',还有本季的'std :: string'类? –

+0

对不起,pmg,我不应该从头开始放c标签。这是因为我使用C字符串 – Jim

回答

3

除了别人已经提到的问题之外,您还没有为tes分配任何内存 - 这只是一个悬挂指针。

变化:

char *tes; 

到,例如:

char tes[80]; 
3

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

2

分割故障通常意味着你试图访问尚未分配的内存,例如

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

将(很有可能)会导致seg故障,因为您正在访问您未分配的内存(mystr go es从0-2)。

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

0

unwind的答案,你的数组的大小为3*(r+c)-6,但你遍历值i = 0; i < r;,这取决于值可能只是运行出界(再加上它是没有意义的)。