2014-12-25 65 views
3

我需要將一個由百萬「零」或「一個」字符組成的字符串(需要指定1039680個字符)轉換爲布爾數組。現在我擁有它的方式需要幾秒鐘才能完成300000個字符的字符串,而且這個過長。我需要能夠在不到一秒的時間內完成整個字母轉換。C將字符串轉換爲布爾數組

我試圖這樣做的方式是讀取一行(在此試用版中)300000個零的文件。

我知道我的代碼對於包含除零或1之外的東西的字符串將起作用,但我知道該字符串將只包含那些字符串。

我也看着atoi,但我不認爲它會適合我的需要。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdbool.h> 

#define BUFFERSIZE 1039680 

int main() 
{ 
    int i ; 
    char buffer[BUFFERSIZE]; 
    bool boolList[BUFFERSIZE] ; 

    // READ FILE WITH A LOT OF ZEROS 
    FILE *fptr; 
    if ((fptr=fopen("300000zeros.txt","r"))==NULL){ 
     printf("Error! opening file\n"); 
     exit(1); 
    } 
    fscanf(fptr,"%[^\n]",buffer); 
    fclose(fptr); 

    // CONVERT STRING TO BOOLEAN ARRAY 
    for (i=0 ; i<strlen(buffer) ; i++) { 
     if (buffer[i] == '1') boolList[i] = 1 ; 
    } 

    return 0; 
} 
+7

您是否嘗試過在循環之前緩存'strlen()'調用?也許你的編譯器正在計算每次迭代中字符串的長度。 –

+1

假設'char'和'bool'都是1個字節大小,迭代緩衝區作爲dword列表,然後執行'dwordboollist [j] = dwordbuffer [j]&0x01010101'。 –

+2

或者你可以迭代而不用長度,一旦你到達空字符就停下來。 – Rufflewind

回答

4

嘗試

char *sptr = buffer; 
bool *bptr = boolList; 
while (*sptr != '\0') 
    *bptr++ = *sptr++ == '1'? 1:0; 
+0

正確。但是,這種「精簡」的代碼不應該沒有文件。它根本不是很酷,至少不是作爲SO的答案。此外,它最有可能不會通過任何生產代碼審查。 -1 – alk

+4

這段代碼很好。 +1 –

2

如果字符串長度總是1039680級人物像你那麼說,你爲什麼要在代碼中使用strlen(buffer)?爲什麼不循環BUFFERSIZE次?你應該像其他人說的那樣緩存結果,而不是每個循環再次調用它。

您還沒有在緩衝區中的NULL終止字節的空間,所以,當你閱讀確切BUFFERSIZE字,字符數組是不是一個有效的NULL結尾的字符串,因此調用的strlen它調用未定義的行爲更重要的是

如果要讀取的文件爲文本,增加一個字符緩衝

char buffer[BUFFERSIZE + 1]; 

否則,打開文件的二進制和一次讀取整個1039680字節塊。那會快很多

fread(buffer, sizeof(buffer[0]), BUFFERSIZE, fptr); 

然後剛過BUFFERSIZE字節循環,並將其設置爲0,沒有分支

for (i = 0 ; i < BUFFERSIZE; i++) 
{ 
    buffer[i] -= '0'; 
} 

你並不需要另一個boolList,只需使用bufferboolList或改變名稱爲boolList並丟棄緩衝區

+0

這樣,是否將char緩衝區轉換爲布爾緩衝區? – Gordian

+0

只有'sizeof(char)== sizeof(bool)''那麼你可以像這樣轉換。否則,你需要單獨的數組,但你仍然可以得到像這樣的'boolList [i] = buffer [i] - '1''的無分支解決方案。但爲什麼不使用char?除非你將它傳遞給其他的接口,否則char就足夠了 –

+0

這是解決這個問題的正確方法,而不需要'char buffer [BUFFERSIZE + 1]中的'BUFFERSIZE + 1'; ''char buffer [BUFFERSIZE];'很好。 – chux

相關問題