来自先前 scanf 的输入附加到另一个 scanf

Input from previous scanf appends to another scanf

程序要求用户输入 2 个学生的姓名、ID 等,将数据写入文件并从文件中读回数据。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(){
    int fd, i = 0;
    char name[20], id[10], dob[10], gender[7], status[10];
    fd = open("file.dat", O_WRONLY|O_CREAT, S_IRWXU); //open file.dat for writing; if it does not exist, create it
    for (i = 0; i < 2; i++){
        //get input from user
        printf("\nFor student %d\n", (i + 1));
        printf("Enter name: ");
        scanf("%[^\n]%*c", name); //%[^\n]%*c - read everything up to (excluding) new line character
        printf("Enter ID: ");
        scanf("%[^\n]%*c", id);
        printf("Enter date of birth: ");
        scanf("%[^\n]%*c", dob);
        printf("Enter gender: ");
        scanf("%[^\n]%*c", gender);
        printf("Enter marital status: ");
        scanf("%[^\n]%*c", status);
        //write current student to file
        write(fd, name, 20);
        write(fd, id, 10);
        write(fd, dob, 10);
        write(fd, gender, 7);
        write(fd, status, 10);
    }
    close(fd);
    //display data from file
    char buf[20];
    fd = open("file.dat", O_RDONLY); //open file for reading
    for (i = 0; i < 2; i++){
        printf("\nFor student %d\n", (i + 1));
        read(fd, buf, 20); //read name
        printf("Name: %s\n", buf);
        read(fd, buf, 10); //read id
        printf("ID: %s\n", buf);
        read(fd, buf, 10); //read date of birth
        printf("Date of birth: %s\n", buf);
        read(fd, buf, 7); //read gender
        printf("Gender: %s\n", buf);
        read(fd, buf, 10); //read marital status
        printf("Marital status: %s\n", buf);
    }
}

输入部分:

学生 1
输入姓名:玛丽·简·史密斯
输入编号:1
输入出生日期:1990 年 9 月 9 日
输入性别:女
输入婚姻状况:单身

学生 2
输入姓名:John Doe Paul
输入编号:2
输入出生日期:1993 年 8 月 8 日
输入性别:男
输入婚姻状况:已婚

显示部分:

学生 1
姓名:玛丽·简·史密斯
编号:1
出生日期:1990 年 9 月 9 日史密斯
性别:女
婚姻状况:单身

学生 2
姓名:John Doe Paul
编号:2
出生日期:08/08/1993aul
性别:男
婚姻状况:已婚

姓名的某些部分被添加到出生日期中。请问这是为什么,我该如何解决?

我读到 scanf 不可靠,但我需要在程序中使用 scanf。

问题不在scanf。问题出在您重新读取文件时的缓冲区处理中。当您读取文件时,您会在缓冲区 "buf" 中重复读取它,这不会以任何方式重置。因此,当您从文件中读取 10 个字符时,之前从名称中插入的 20 个字符仍在缓冲区中,因此会显示出来。您需要正确终止字符串(使用'\0')或在使用缓冲区时将缓冲区设置为全零,以确保不会 "old content" 返回。