C将字符串转换为布尔数组

时间:2014-12-25 18:15:56

标签: c arrays string boolean

我需要转换一个包含数百万'零的字符串。或者'一个'布尔数组中的字符(特定的1039680个字符)。我现在拥有它的方式需要几秒钟才能获得300000个字符串,这太长了。我需要能够在不到一秒的时间内完成整个魔法角色转换。

我尝试这样做的方法是读取一行(在此试用案例中)300000个零的文件。

我知道我的代码对包含除零或一些以外的东西的字符串起作用时,但我知道字符串只包含那些。

我也看过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;
}

2 个答案:

答案 0 :(得分:4)

尝试

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

答案 1 :(得分:2)

如果字符串长度总是像你说的1039680个字符那么为什么你在代码中使用strlen(buffer)?为什么不循环BUFFERSIZE次?你应该像其他人一样缓存结果,而不是一次又一次地调用它。

更重要的是,你没有在缓冲区中包含NULL终止字节的空间,所以当你读取精确的BUFFERSIZE个字符时,char数组不是一个有效的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,只需将buffer用作boolList或将名称更改为boolList并弃用缓冲区