FILE IO,标记字符串

时间:2014-07-03 21:26:08

标签: 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 = 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);
    }

}

3 个答案:

答案 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;
}