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 指向数组的指针。
这个问题让我有点困惑,希望得到一些意见。我正在输入一个包含许多复数的 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 指向数组的指针。