fscanf来自c中文件的一行

Ada*_*rad 1 c string file scanf

我有一个文件,我需要读取某些变量.信息以分隔符存储在文件中; 将每一点信息分开.例如:

308163583; Adam; Fro; 22; M; mogar; mmMM8675;喜欢在沙滩上散步; 1,2,3,4;

之后我将把这些信息放入一个结构中,但现在这个不相关.问题是它扫描一切都很好,直到"喜欢在海滩上行走"并停在"喜欢",只扫描这个词到描述字符串

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXID 10
#define MAXN 11
#define MAXPAS 7
#define MAXDES 201
#define MAXHOB 4
#define MAXGEN 2
typedef enum { false, true } bool;
typedef struct {

    char* id;
    char* fname;
    char* lname;
    int age;
    char* gender;
    char* username;
    char* password;
    char* description;
    int hobbies;
}User;
typedef struct {
    User *users;
    int num_users;
}List;

void inputFunction(FILE *ifp);
void main() {
    FILE *ifp;
    char mode[] = "r";
    ifp = fopen("input.txt", mode);
    if (ifp == NULL) {
        puts("Can't open input file");
        exit(1);
    }
    inputFunction(ifp);
}

void inputFunction(FILE *ifp) {
    List userList;
    userList.users = (User*)malloc(1 * sizeof(User));
    int i = 0;
    char id[MAXID], fname[MAXN], lname[MAXN], gender[MAXGEN],
       username[MAXN], password[MAXPAS], description[MAXDES];
    int age, hobbies[MAXHOB];
    while (fscanf(ifp, "%s ;%s ;%s ;%d;%s ;%s ;%s ;%s;%d,%d,%d,%d", id,
      fname, lname, &age, gender, username, password, description,
      &hobbies[0], &hobbies[1], &hobbies[2], &hobbies[3])!=EOF)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*ens 7

那是因为scanf %s被指定为匹配一系列非空白字符.您希望它扫描一系列非分号字符.作为练习留下:-)提示:阅读手册并查看说明%[...]符的工作原理.

另请注意

while (fscanf(...) != EOF)
Run Code Online (Sandbox Code Playgroud)

是一个巨大的错误,因为fscanf返回成功转换项目的数量,即如果没有转换则为0,如果所有项目都已转换,则为12.测试EOF您无法检测到正确转换的项目是否少于12个.您应该认真考虑从上到下阅读scanf/fscanf手册.它非常有启发性,并将在整个编程生涯中一次又一次地证明是有价值的.