2014-01-19 74 views
0

我有一個字符串,其中包含任意數量的數字的任意數量的整數,我需要將每個整數解析爲以前分配的程序矩陣的一個元素。出於某種原因,輸出被複制字符串的最後一個數字時,給出一個新的字符串,就像這樣:解析字符串導致重複值

的data.txt

1 4 5 6 8 
5 5 5 5 5 
3 3 3 3 3 
1 1 1 1 1 

程序輸出:

1 4 5 6 5 
5 5 5 5 3 
3 3 3 3 1 
1 1 1 1 1 

我可以看到每行的最後一個元素被下一行的第一個元素覆蓋,但我不知道爲什麼它正在這樣做。下面是相關的代碼:

while(getline(inFile, readIn)) { 
     parse(readIn, mtrx, r); 
     r++; 
    } 

//...... 

void parse(string str, matrix& mtrx, int r) 
{ 
    string value = ""; 
    str.append("*"); 
    int i=0;      //finds integers in string 
    int c=0;      //place holders for columns 
    while(i < str.length()) { 
     value = ""; 
     while(str[i] != ' ' && str[i] != '*') { 
      value += str[i]; 
      i++; 
     } 
     mtrx.set(r,c, atoi(value.c_str())); 
     c++; 
     i++; 
    } 
} 
+0

編譯所有警告和調試信息(例如'g ++ -Wall -g')。學習如何使用調試器(例如'gdb')。對於任意大的數字,請考慮使用[bignum](http://en.wikipedia.org/wiki/Bignum)庫,如[GMPlib](http://gmplib.org/) –

+1

一些提示:使用矢量載體,閱讀['std :: istringstream'](http://en.cppreference.com/w/cpp/io/basic_istringstream),['std :: copy'](http://en.cppreference.com/ w/cpp/algorithm/copy),['std :: istream_iterator'](http://en.cppreference.com/w/cpp/iterator/istream_iterator)和['std :: back_inserter'](http:// en.cppreference.com/w/cpp/iterator/back_inserter)。使用它,這樣做其實很簡單。 –

+0

當你知道長度是多少時,爲什麼要添加'*'? – kfsone

回答

2

看起來你MTRX僅僅是4×4的元素,因爲在C++中默認沒有數組邊界測試,所以你可以閱讀登天。當寫入一行的最後一個元素時,可以寫入下一行的第一個元素,寫入下一行時將覆蓋它。當讀取一行的最後一個元素時,讀取下一行的第一個元素。最後一行的最後一個元素是可以的,因爲你寫的超出了數組本身並且讀回來了,但是這會導致一些有趣的其他問題。