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

时间:2017-11-30 21:22:09

标签: c strtok

这个问题让我感到困惑,因为我想要一些投入。我正在输入一个包含许多复数的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);

}

1 个答案:

答案 0 :(得分:2)

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

char data[] = {0};

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

char data[1] = {0};

你需要使这个大到足以保持你正在阅读的行fgets(),所以它应该是:

char data[999999];

没有必要对其进行初始化,因为在用fgets()填写之前不要使用它。

使用strtok()时遇到的问题是您没有在分隔符列表中包含空格。此外,如果您希望i字符成为令牌的一部分,则应位于分隔符列表中。并且您需要在分隔符中包含],因此您不会在最后一个标记中包含]]]。所以循环应该是:

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

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