gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:06:30 32 4
gpt4 key购买 nike

程序要求用户输入 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
姓名:李四保罗
编号:2
出生日期:08/08/1993aul
性别:男
婚姻状况:已婚

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

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

最佳答案

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

关于c - 来自先前 scanf 的输入附加到另一个 scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32596149/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com