我需要将由一百万个“零”或“一”字符(具体为1039680个字符)组成的字符串转换为布尔数组。目前我的方法对于300000个字符的字符串需要几秒钟,这太长了。我需要能在不到一秒钟内完成整个百万字符的转换。
我的尝试是读取一个包含一行(在这个试验中为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;
}
strlen()
的调用吗?也许你的编译器在每次迭代中都在计算字符串的长度。 - Darien Pardinasstrlen
的重复调用。不是只调用一次并将i<strlen(buffer)
替换为计算出的值,而是在 for 循环的每次迭代中都会调用strlen
,导致buffer
被迭代了 300k 次。Rufflewind 的解决方案仍然更好。 - foobar