我试图读取逗号分隔文件,并通过逗号分隔符和打印名称创建标记。但是在标记化后不会打印名称。
names.csv看起来像
issac,sanchez
anothony,huerta
abbie,lynn
mark,beasly
alyssa,emily
我当前的代码
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE* fp;
char buffer[100];
fp = fopen("names.csv","r");
while(fgets(buffer,sizeof(buffer),fp) != NULL)
printf("%s\n",buffer);
/*OUTPUT issac,sanchez
anthony,huerta
abbie,lynn...etc so buffer is a string??*/
char* del = ",";
char* token;
token = strtok(buffer,del);
while(token != NULL)
{
printf("%s\n",token);
token = strtok(NULL,del);
}
}
答案 0 :(得分:2)
如果我不#include <string.h>
,程序会出现段错误。否则,它可以正常工作,在一行打印alyssa
,在另一行打印emily
。
gcc输出没有#include <string.h>
使用-Wall和-std = c99标志:
names.c:16:2: warning: implicit declaration of function `strtok` [-Wimplicit-function-declaration]
names.c:16:8: warning: assignment makes pointer from integer without a cast [enabled by default]
names.c:19:9: warning: assignment makes pointer from integer without a cast [enabled by default]
第16行和第19行是调用strtok
的行。由于未声明的函数默认返回int
,而token
是指针,因此会引发警告。
在我的计算机上sizeof(int) != sizeof(char *)
,这会导致生成错误的代码;只有4个字节存储在token
指针中,后来printf
尝试从token
读取8个字节 - 来自strtok
和4返回的8字节指针的4个有效字节随机/未知字节,导致分段错误。
答案 1 :(得分:0)
buffer
包含fgets最后一次成功读取的结果,该结果可能是文件末尾的换行符。 while循环体永远不会执行。修复:fseek到文件的开头,然后重新开始。
答案 2 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //for strtok
int main(void){
FILE* fp;
char buffer[100];
const char *del = ",\n";
fp = fopen("names.csv","r");
while(fgets(buffer, sizeof(buffer), fp) != NULL){
//printf("%s\n", buffer);
char* token = strtok(buffer, del);
while(token != NULL){
printf("%s\n", token);
token = strtok(NULL, del);
}
}
fclose(fp);
return 0;
}