2

我正在编写一个 Objective-C 程序来处理带有 XCODE 4.3.1 和 ARC 的生物分子的轨迹。我需要阅读 PDB 文件,即解析大量文本格式的数据。我对 NSString 的低效率感到非常失望,并试图编写一个 C 等效的 componentsSeparatedByString:。该算法适用于 NSString 和 NSMutableArrays,但我很难使用 char* 和 char**。

不幸的是,我收到了 EXC_BAD_ACCESS 错误。奇怪的是,我得到了 i=68103 和 j=68049 的错误(这些数字是否对您响起?),这意味着它在崩溃之前工作了一段时间。错误是“静态的”(总是以相同的 (i,j) 数字阻塞)。该数组似乎工作得很好(崩溃前的 NSLog 值)。

看起来,我对 C 代码和指针背后的微妙之处不是很有经验,但我肯定很高兴听到你的建议,让它工作!谢谢 !

继承人的代码:

+(char**) componentsSeparedByNewLineCEQUIV:(const char*)aChar:(int*)numWord
{ // char* aChar : my file, is typically 3 millions characters
int j=-1; //Last non space character
int i; //Scanned character
int len=strlen(aChar);

char** stringArray=malloc((*numWord)*sizeof(char*));

for (i=0;i<len; i++)
{   if (aChar[i]==10)
    {
        if ( j!=-1)
        {   
            char* buffer2=malloc(i-j+1);
            strcpy(buffer2, strndup(aChar+j, i-j));
            stringArray[i]=malloc(sizeof(char)*strlen(buffer2)+1); //EXC_BAD_ACCESS HERE
            strcpy(stringArray[i], buffer2);
        }
        j=-1;
    }
    else if (j==-1)
    {j=i;}
}
if (j!=-1)
{   char* buffer2=malloc(i-j+1);
    strcpy(buffer2, strndup(aChar+j, i-j));
    stringArray[i]=malloc(strlen(buffer2)+1);
    strcpy(stringArray[i], buffer2);
}

return stringArray;
}
4

4 回答 4

0

你可能不是第一个遇到这个问题的人:)

为什么不只使用strtok

PS 什么分析表明 NSString 是你的问题?

于 2012-09-25T11:26:27.867 回答
0

更新给所有可能感兴趣的人:这是一个工作版本,使用 strtok 可能很有用,尽管我仍然对我的代码的响应感兴趣。

此代码已经过测试,比 [astring componentsSeparatedByString:@"\n"] ... 快 5 倍(125ms vs 581ms)。

+(char**)componentsSeparatedByNewLine:(const char*)aChar:(int*)numWord
{

int i;
int j=0;
int len = strlen(aChar);
*numWord=1;
for (i=0;i<len; i++)
{
    if (aChar[i]==10) *numWord=*numWord+1;   //change 10 for any other character (ASCII for space)
}

char** stringArray=malloc((*numWord)*sizeof(char*));
char* pch;

char* aChar2=malloc(len+1);
strcpy(aChar2,aChar);

pch = strtok(aChar2,"\n");
while (pch != NULL)
{   
    stringArray[j]=(char*)malloc( (strlen(pch)+1)*sizeof(char));
    strcpy(stringArray[j], pch);
    //NSLog(@"%s",stringArray[j]);
    j=j+1;
    pch = strtok (NULL, "\n");
}
return stringArray;
}
于 2012-09-26T15:53:56.603 回答
0

我不知道为什么错误出现在它应该在上面的那一行。但是你正在复制一个未分配的字符串。
stringArray[i] 复制时未分配 buffer2,分配它:

    if ( j!=-1)
    {   
        char* buffer2=malloc(i-j+1);
        strcpy(buffer2, strndup(aChar+j, i-j));
        stringArray[i]=malloc(sizeof(char)*strlen(buffer2)+1); //EXC_BAD_ACCESS HERE
        stringArray[i]=(char*)malloc( (strlen(buffer2)+1)*sizeof(char));  // Allocate the string
        strcpy(stringArray[i], buffer2);
    }
于 2012-09-25T11:36:26.663 回答
0

第一:如果我没有完全错,但我认为你消耗的内存至少是你需要的 4 倍:

malloc用于创建buffer2strndup用于获取所需的字符。strndup完全符合您的要求,但一步到位。char* buffer2 = strndup(aChar+j, i-j)应该是你的第一步。更糟糕的是,在接下来的两行中,您必须再次做同样的事情。所以我认为你真正想要的是stringArray[i] = strndup(aChar+j, i-j)。看内存问题:所有函数都errno用来表示内存分配失败。

第二:您的函数不会返回组件的数量,因此您stringArray可能会在不知不觉中包含一些垃圾。

第三:strlen贵,不需要,直接用for(int i = 0; aChar[i] != '\0'; i++)

于 2012-09-25T14:03:56.190 回答