2011-07-07 166 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;,這取決於值可能只是運行出界(再加上它是沒有意義的)。