gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:28:19 24 4
gpt4 key购买 nike

这个问题让我有点困惑,希望得到一些意见。我正在输入一个包含许多复数的 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() 的问题是您没有在定界符列表中包含空格。此外,如果您希望 i 字符成为 token 的一部分,它应该在定界符列表中。并且您需要在分隔符中包含 ],这样您就不会在最后一个标记中包含 ]]]。所以循环应该是:

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

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

关于c - strtok() 给出意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47582817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com