C 文件IO,标记字符串
我试图读取一个逗号分隔的文件,并通过逗号分隔符和打印名称创建标记。但名称不会在标记化后打印 names.csv看起来像C 文件IO,标记字符串,c,file-io,segmentation-fault,token,C,File Io,Segmentation Fault,Token,我试图读取一个逗号分隔的文件,并通过逗号分隔符和打印名称创建标记。但名称不会在标记化后打印 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 = fo
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);
}
}
#包括
#包括
内部主(空)
{
文件*fp;
字符缓冲区[100];
fp=fopen(“names.csv”,“r”);
while(fgets(buffer,sizeof(buffer),fp)!=NULL)
printf(“%s\n”,缓冲区);
/*输出issac,桑切斯
安东尼,休尔塔
abbie,lynn…等等所以缓冲区是一个字符串*/
char*del=“,”;
字符*令牌;
令牌=strtok(缓冲区,del);
while(令牌!=NULL)
{
printf(“%s\n”,标记);
令牌=strtok(空,del);
}
}
缓冲区
包含fgets上次成功读取的结果,该结果可能是文件末尾的换行符。while循环体从不执行。修复:fseek到文件的开头,然后重新开始。如果我没有#include
,程序会出错。否则,它会工作,在一行上打印alyssa
,在另一行上打印emily
不带#的gcc输出包括使用-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个字节存储在令牌
指针中,稍后printf
尝试从令牌
中读取8个字节-从strtok
返回的8字节指针中读取4个有效字节和4个随机/未知字节,导致分段错误。\35;
#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;
}
#包括
#包括//用于strtok
内部主(空){
文件*fp;
字符缓冲区[100];
常量字符*del=“,\n”;
fp=fopen(“names.csv”,“r”);
while(fgets(buffer,sizeof(buffer),fp)!=NULL){
//printf(“%s\n”,缓冲区);
char*token=strtok(缓冲区,del);
while(令牌!=NULL){
printf(“%s\n”,标记);
令牌=strtok(空,del);
}
}
fclose(fp);
返回0;
}
这可能是因为缓冲区是字符串文字,我无法标记它吗?应该有更多的警告,比如“strtok的隐式声明”…换句话说:Include
。使用符合C99标准的编译器。不,buffer
不是一个文本,而是一个变量。它指向一个可修改的字符串。谢谢,我没有收到任何错误,但是令牌不会打印。快速浏览一下有什么想法吗?while循环读取到文件的末尾,所以在最后一个循环之后缓冲区将是空的。您可能想将strtok及其所有代码放入循环中