C 文件IO,标记字符串

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

我试图读取一个逗号分隔的文件,并通过逗号分隔符和打印名称创建标记。但名称不会在标记化后打印

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);
    }

}
#包括
#包括
内部主(空)
{
文件*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及其所有代码放入循环中