2012-02-10 128 views
0

所以我試圖創建一個Befunge interperter並將一個文本文件讀入一個數組。 我使用這個代碼:將一個std :: string放入一個char [] []數組

char map[100][100]; //not 85 x 20 
//load the source 
ifstream f; 
f.open("file.txt", ios::in); 
string s; 
int i = 0; 
while(f.good() && i < 100) 
{ 
    getline(f, s); 
    map[i] = s.c_str(); 
    i++; 
} 

這是不行的,沒有人知道一個辦法做到這一點,而不通過串手動循環?

+2

但是你明白_why_它不起作用嗎?這很重要... – ildjarn 2012-02-10 23:09:50

+2

使用'strcpy'並注意緩衝區溢出。你不能分配給一個數組。或者甚至更好,使用'std :: vector '而不是yacky C字符串 – 2012-02-10 23:10:08

+0

任何你不能使用'std :: vector '或者甚至是'std :: string [100]'的原因?如果您使用C++,請利用其類型! – 2012-02-10 23:14:44

回答

3

使用strncpy()並指定字節數:中

strncpy(map[i], s.c_str(), 100); 
map[i][99] = '\0'; /* this could trim s.c_str(), but at least you don't get an overflow */ 

代替:

map[i] = s.c_str(); 

通過指定複製的字節數量,頂多100,可以確保你不」 t溢出map[i]。如果strlen(s.c_str()) < 100strncpy()函數將填充map[i]終止符。在strlen(s.c_str()) >= 100的情況下,字符串將被截斷以便爲map[i]提供必要的空終止符。

+0

這將工作,但我打算使用std :: vector ,因爲我不需要限制存儲。不過謝謝。 – Chris 2012-02-10 23:18:19

+0

使用'string'的'vector'肯定會是最習慣的C++方法,並且您不必處理行長度問題(至少多達系統內存,或多或少)。 – 2012-02-10 23:24:46

0

我認爲它是安全的這樣做

char* map[100]; 
.... 

while(f.good() && i < 100) 
{ 
    getline(f, s); 
    map[i] = new char[s.length() + 1]; 
    strcpy (map[i], s.c_str()); 
    i++; 
} 
+0

爲了確保安全,您可能需要測試map [i] = ...的結果''確保你在'strcpy()'之前有實際可用的空間。 – 2012-02-10 23:23:13

+0

我說「更安全」,而不是「最安全」))))我給了一個想法和思路的方向,而不是一個現成的代碼 – mikithskegg 2012-02-10 23:25:21

-1

相反,已經張貼在這裏其他的答案,你不應該在嘗試使用的strcpy複製到「地圖」。 在進行任何複製之前,您需要確保不會超出緩衝區。爲此,您不應使用源的大小,而應使用目標的大小。原因是源可能比目的地有更長的時間。爲了避免在完成其他一些密集計算之前可能無法解決的問題,您應該確保您不會嘗試複製到不足以包含您要複製的內容的目標進去。

這是複製串函數簽名(當然,你應該用在這裏的人):

strncpy(dest, source, size); 

下面是你應該使用什麼:

strncpy(map[i], s.c_str(), sizeof(map[i])); 

編輯:

或者,您可以使用strncpy_s()(如果您在Windows上!),它允許您指定源和目標長度。

strncpy_s(dest, dest_size, source, source_size) 
相關問題