如何在C中用fgets或fscanf拆分字符串?

时间:2017-09-13 18:35:36

标签: c

我理解如何读取文本文件并扫描/打印整个文件,但如何将一行分成几个字符串?另外,可以将变量分配给稍后要调用的字符串吗? 到目前为止我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE *fPointer;
    fPointer = fopen("p1customer.txt", "r");
    char singleLine[150];
    int id;


    while (!feof(fPointer)){
        fscanf(fPointer, "%d", &id);
        printf("%d",id);

    }

    fclose(fPointer);
    return 0;   
}

要读取的示例文本文件: 99999 John Doe篮球

示例输出: John Doe的身份证号码为99999并且打篮球

我正在尝试拆分/标记这些字符串并为它们分配变量(IDnumber,Name,Sport)并将输出打印在新文件中。

2 个答案:

答案 0 :(得分:0)

您可以使用库函数strtok(str,chrs)函数。 strtok(str,chrs)一系列调用将str拆分为令牌,每个令牌都由chrs中的字符分隔。

序列中的第一个调用是非空str。它在str中找到第一个由chars而不是chrs组成的标记;它通过覆盖下一个字符来终止它str \0并返回指向token的指针。由NULLstr指示的每个后续调用都会重新指向下一个此类token的指针,从刚刚结束的那个搜索过来。

答案 1 :(得分:0)

您应该发布输入文件的示例,以便您可以更详细地提供帮助。 我已经看到你也输入了一个字符串,我想你想填写一些东西,但你没有指明。 如果要将文件视为数字列表,则代码示例可能如下所示。

#include <stdio.h>

int main() {
    FILE *infile;
    char buf[100];
    int len_file=0;

    if(!(infile = fopen("p1customer.txt", "r"))) { /*checks the correct opening of the file*/
        printf("Error in open p1customer.txt\n");
        return 1;
    }

    while(fgets(buf,sizeof(buf),infile)!=NULL) /*check the lenght of the file (number of row) */
        len_file++;

    int id[len_file];
    int i=0;

    rewind(infile);

    while(fgets(buf,sizeof(buf),infile)!=NULL) {
        sscanf(buf,"%i",&id[i]);
        i++;
    }

    for(i=0;i<len_file;i++)
        printf("%i\n",id[i]);

    fclose(infile);

    return 0;
}

如果要将文件视为由空格分隔的每行上的数字的不确定列表,则可以使用sscanf格式%31[^ ]中的字符串解析,其中任务包括读取在遇到空格之前,您还可以添加一个变量,该变量对于读取的每个字符/数字都会递增。 然后,您可以使用isalpha库中的ctype.h函数检查行中是否有任何字符,以查看是否有任何字符,然后将它们插入字符串,直到找到终止字符'\ 0'

可能性是无限的,所以输入文件很有用,当你提供它时,我会更新答案。