strtok() 给出意想不到的结果

strtok() giving unexpected results

这个问题让我有点困惑,希望得到一些意见。我正在输入一个包含许多复数的 ascii 文件,我正在使用带有分隔符 "+"" " 的 strtok 对其进行标记化。该文件的格式如下:[[[0+0i 0+0i 0+0i 0+0i.......]]]。我希望第一个标记为 0,第二个标记为 0i。我实际上得到 "0,0i" 作为我的第一个标记。以下是正在使用的代码:

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

char data[]={0};
int line = 0;
char *datap[231000];
int i,n;

void main()
{
    FILE * filei = fopen("signal_subband_16.ascii","r");
    FILE * fileo = fopen("Output_file_simple.txt","a");
    if(filei==NULL){
        printf("There was an error opening the input file");
        exit(1);
    }
    else if(fileo==NULL){
        printf("There was an error opening the output file");
        exit(1);
    }
    else{
        while(fgets(data,999999,filei)){
            line ++;
            //      printf("Line: %d -> %s", line, data);
        }
    }

    datap[0]=strtok(data,"[+");
    n = 1;
    while(datap[n-1]!=NULL){
        datap[n] = strtok(NULL,"i+");
        n++;
    }

    //for(i=0;i<n;i+2){
    //  printf("%s %s\n", datap[i], datap[i+1]);
    //}

    printf("%s\n, %s\n",datap[0], datap[1]);

    fclose(filei);
    fclose(fileo);
}

任何帮助或推动正确答案将不胜感激。 谢谢

新代码功能

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




char data[999999];
int line = 0;
char *datap[231000];
int i,n;


void main()
{
FILE * filei = fopen("signal_subband_16.ascii","r");
FILE * fileo = fopen("Output_file_simple.txt","a");
if(filei==NULL){
    printf("There was an error opening the input file");
    exit(1);
}
else if(fileo==NULL){
    printf("There was an error opening the output file");
    exit(1);
}
else{
    while(fgets(data,999999,filei)){
        datap[0]=strtok(data,"[ +");
        n = 1;
        while(datap[n-1]!=NULL){
            datap[n] = strtok(NULL,"i +]");
            n++;
            }

    for(i=0;i<n;i+2){
    printf("%s %s\n", datap[i], datap[i+1]);
}
    memset(data,0,999999);
    line ++;

    }

}






fclose(filei);
fclose(fileo);

}

您的代码最大的问题是您在 data 数组的范围之外编写代码。当您声明一个空大小的数组时,它的大小刚好足以容纳初始化列表中的值。所以

char data[] = {0};

声明一个只有 1 个元素的数组,相当于

char data[1] = {0};

你需要让它足够大以容纳你用 fgets() 阅读的行,所以它应该是:

char data[999999];

没有必要初始化它,因为在你用 fgets() 填充它之前你不会使用它。

您使用 strtok() 的问题在于您没有将 space 包含在分隔符列表中。此外,如果您希望 i 字符成为标记的一部分,它应该 而不是 在定界符列表中。并且您需要在分隔符中包含 ],这样您就不会在最后一个标记中包含 ]]]。所以循环应该是:

datap[0]=strtok(data,"[+");
n = 1;
while(datap[n-1]!=NULL){
    datap[n] = strtok(NULL," +]");
    n++;
}

另请注意,在出现此循环的位置,data 仅包含文件的最后一行。您没有解析文件中的任何其他行。目前尚不清楚这是否有意为之。如果你想解析文件的所有行,这个循环应该在读取每一行的循环内部。而且你需要为每一行制作一个 data 的副本,因为你每次阅读一行时都会覆盖它,而 strtok() 只是 returns 指向数组的指针。