我正在尝试使用带有制表符分隔符的strtok拆分一行。我的代码和输入如下所示。我想将这些标记存储到field1,field2,field3。
代码:
while(fgets(line,80,fp1)!=NULL) //Reading each line from file to calculate the file size.
{
field1=strtok(line," ");
//field1=strtok(NULL,"");
field2=strtok(NULL," ");
field3=strtok(NULL," ");
if(flag != 0)
printf("%s",field1);
flag++;
}
输入:
315 316 0.013
315 317 0.022
316 317 0.028
316 318 0.113
316 319 0.133
318 319 0.051
320 324 0.054
321 322 0.054
我当前的输出:(如果我打印field1)
315 316 0.013
315 317 0.022
316 317 0.028
316 318 0.113
316 319 0.133
318 319 0.051
320 324 0.054
321 322 0.054
答案 0 :(得分:3)
while(fgets(line,80,fp1)!=NULL) //Reading each line from file to calculate the file size.
{
char *p;
p = strtok(line, '\t');
int itr = 0;
while(p != NULL) {
if(itr == 0){
strcpy(field1, p);
itr++;
}
else if(itr == 1){
strcpy(field2, p);
itr++;
}
else {
strcpy(field3, p);
itr = 0;
}
p = strtok(NULL, '\t');
}
printf("%s%s%s", field1, field2, field3);
// store it in array if needed
}
答案 1 :(得分:2)
看看这里的信息:
http://www.cplusplus.com/reference/cstring/strtok/
您指定空格作为用作标记器的分隔符,但您的字符串没有空格(对我来说似乎是标签)。那么,strtok的作用是从头开始并查找tab(“\ t”)。它一直持续到字符串的结尾并且找不到它,但它确实找到了最后的\ 0,所以它在开始时返回字符串,因为strtok总是在找到令牌之前给出字符串。
将分隔符更改为“\ t”,然后打印每个字段变量。
答案 2 :(得分:2)
我建议只使用sscanf。它将标签作为分隔符处理。
#include <stdio.h>
#include <stdlib.h>
int
main()
{
char line[80], field1[32], field2[32], field3[32];
FILE *fp;
fp = fopen("testfile", "r");
if (fp == NULL) {
printf("Could not open testfile\n");
exit(0);
}
while (fgets(line, sizeof(line), fp) != NULL) {
sscanf(line, "%s%s%s", field1, field2, field3);
printf("%s %s %s\n", field1, field2, field3);
}
exit(0);
}