C程序中scanf和printf中奇怪的新行问题
当我运行这些打印和扫描时,我得到了正确的用户输入,但由于某些原因,这些线条似乎在奇怪的地方中途断裂 我可以通过在每个printf的开头添加\n来修复它,但是每行之间都有一个完整的空间 有办法解决吗C程序中scanf和printf中奇怪的新行问题,c,printf,scanf,C,Printf,Scanf,当我运行这些打印和扫描时,我得到了正确的用户输入,但由于某些原因,这些线条似乎在奇怪的地方中途断裂 我可以通过在每个printf的开头添加\n来修复它,但是每行之间都有一个完整的空间 有办法解决吗 #include <stdio.h> #include <string.h> #include <stdbool.h> struct Student { char id[9]; char name[30]; char emailId[10]
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
struct Student
{
char id[9];
char name[30];
char emailId[10];
char courseId[10];
char grade[4];
};
FILE *studentFile;
bool exitMenu = false;
void displayMainMenu();
int makeChoice();
void createRecord();
void displayRecord();
void seekRecord();
void updateRecord();
void deleteRecord();
int main()
{
while(!exitMenu)
{
displayMainMenu();
makeChoice();
}
return 0;
}
void displayMainMenu()
{
printf("\tM A I N M E N U");
printf("\n1. Create the Binary File");
printf("\n2. Display the contents of the file");
printf("\n3. Seek a specific record");
printf("\n4. Update the contents of a record");
printf("\n5. Delete a record for the specific name");
printf("\n6. Exit");
printf("\n\n\t Please Enter your choice .... ");
}
int makeChoice()
{
int choice = 0;
scanf("%d", &choice);
switch(choice)
{
case 1:
//Create the Binary File
createRecord();
break;
case 2:
//Display the contents of the file
displayRecord();
break;
case 3:
//Seek a specific record
seekRecord();
break;
case 4:
//Update a record for the specific name
updateRecord();
displayRecord();
break;
case 5:
//Delete a record for the specific name
deleteRecord();
displayRecord();
break;
case 6:
//Exit
exitMenu = true;
break;
default:
break;
}
return choice;
}
void createRecord()
{
studentFile = fopen("studentFile.bin","ab");
int i;
struct Student student;
printf("Enter Student ID: ");
scanf("%s",student.id);
printf("Enter Student Name: ");
scanf("%s",student.name);
printf("Enter Email ID: ");
scanf("%s",student.emailId);
printf("Enter Course ID: ");
scanf("%s",student.courseId);
printf("Enter Grade: ");
scanf("%s",student.grade);
fwrite(&student,sizeof(student),1,studentFile);
fclose(studentFile);
}
void displayRecord()
{
studentFile=fopen("studentFile.bin","rb");
struct Student student;
while(fread(&student,sizeof(student),1,studentFile))
{
printf("\n------------------------------------------\n");
printf("Student ID: %s",student.id);
printf("\nStudent Name: %s",student.name);
printf("\nEmail ID: %s",student.emailId);
printf("\nCourse ID: %s",student.courseId);
printf("\nGrade: %s",student.grade);
printf("\n------------------------------------------\n");
}
fclose(studentFile);
}
void seekRecord()
{
struct Student student;
char id[9];
printf("Enter Student ID: ");
scanf("%s",id);
studentFile = fopen("studentFile.bin","rb");
while(fread(&student,sizeof(student),1,studentFile))
{
if(strcmp(student.id,id)==0)
{
printf("\tStudent Record Found.");
printf("\n------------------------------------------\n");
printf("Student ID: %s",&student.id);
printf("\nStudent Name: %s",&student.name);
printf("\nEmail ID: %s",&student.emailId);
printf("\nCourse ID: %s",&student.courseId);
printf("\nGrade: %s",&student.grade);
printf("\n------------------------------------------\n");
break;
}
}
}
void updateRecord()
{
FILE *tempFile;
char id[9];
printf("Enter Student ID: ");
scanf("%s",id);
studentFile=fopen("studentFile.bin","rb");
tempFile = fopen("tempFile.bin","wb");
struct Student student;
while(fread(&student,sizeof(student),1,studentFile))
{
if(strcmp(student.id,id)==0)
{
printf("Enter Updated Student ID: ");
scanf("%s",student.id);
printf("Enter Updated Student Name: ");
scanf("%s",student.name);
printf("Enter Updated Email ID: ");
scanf("%s",student.emailId);
printf("Enter Updated Course ID: ");
scanf("%s",student.courseId);
printf("Enter Updated Grade: ");
scanf("%s",student.grade);
fwrite(&student,sizeof(student),1,tempFile);
}
else
{
fwrite(&student,sizeof(student),1,tempFile);
}
}
fclose(studentFile);
fclose(tempFile);
remove("studentFile.bin");
rename("tempFile.bin","studentFile.bin");
}
void deleteRecord()
{
FILE *tempFile;
struct Student student;
char name[30];
printf("Enter Student Name: ");
scanf("%s",name);
studentFile = fopen("studentFile.bin","rb");
tempFile = fopen("tempFile.bin","wb");
while(fread(&student,sizeof(student),1,studentFile))
{
if(strcmp(student.name,name) !=0)
{
fwrite(&student,sizeof(student),1,tempFile);
}
}
fclose(studentFile);
fclose(tempFile);
remove("studentFile.bin");
rename("tempFile.bin","studentFile.bin");
}
#包括
#包括
#包括
体类型
{
字符id[9];
字符名[30];
char-emailId[10];
char-courseId[10];
煤焦级[4];
};
档案*学生档案;
bool exitMenu=假;
void displayMainMenu();
int makeChoice();
void createRecord();
void displayRecord();
void seekRecord();
void updateRecord();
作废删除记录();
int main()
{
而(!exitMenu)
{
显示主菜单();
makeChoice();
}
返回0;
}
void displaymain菜单()
{
printf(“\tM A in M E N U”);
printf(“\n1.创建二进制文件”);
printf(“\n2.显示文件内容”);
printf(“\n3.查找特定记录”);
printf(“\n4.更新记录内容”);
printf(“\n5.删除特定名称的记录”);
printf(“\n6.Exit”);
printf(“\n\n\t请输入您的选择…”);
}
int makeChoice()
{
int-choice=0;
scanf(“%d”,选择(&C);
开关(选择)
{
案例1:
//创建二进制文件
createRecord();
打破
案例2:
//显示文件的内容
displayRecord();
打破
案例3:
//寻找特定记录
seekRecord();
打破
案例4:
//更新特定名称的记录
updateRecord();
displayRecord();
打破
案例5:
//删除特定名称的记录
deleteRecord();
displayRecord();
打破
案例6:
//出口
exitMenu=true;
打破
违约:
打破
}
回报选择;
}
void createRecord()
{
studentFile=fopen(“studentFile.bin”、“ab”);
int i;
结构学生;
printf(“输入学生ID:”);
scanf(“%s”,学生id);
printf(“输入学生姓名:”);
scanf(“%s”,学生姓名);
printf(“输入电子邮件ID:”);
scanf(“%s”,student.emailId);
printf(“输入课程ID:”);
scanf(“%s”,student.courseId);
printf(“输入等级:”);
scanf(“%s”,学生成绩);
fwrite(&student,sizeof(student),1,studentFile);
fclose(学生档案);
}
void displayRecord()
{
studentFile=fopen(“studentFile.bin”、“rb”);
结构学生;
while(fread(&student,sizeof(student),1,studentFile))
{
printf(“\n-------------------------------------------\n”);
printf(“学生ID:%s”,Student.ID);
printf(“\n学生名:%s”,学生名);
printf(“\n邮件ID:%s”,student.emailId);
printf(“\n课程ID:%s”,student.courseId);
printf(“\n年级:%s”,学生成绩);
printf(“\n-------------------------------------------\n”);
}
fclose(学生档案);
}
void seekRecord()
{
结构学生;
字符id[9];
printf(“输入学生ID:”);
scanf(“%s”,id);
studentFile=fopen(“studentFile.bin”、“rb”);
while(fread(&student,sizeof(student),1,studentFile))
{
如果(strcmp(学生id,id)==0)
{
printf(“\t找到学生记录”);
printf(“\n-------------------------------------------\n”);
printf(“学生ID:%s”,&Student.ID);
printf(“\n学生姓名:%s,&student.Name”);
printf(“\n邮件ID:%s”,&student.emailId);
printf(“\n课程ID:%s”,&student.courseId);
printf(“\n年级:%s,&student.grade”);
printf(“\n-------------------------------------------\n”);
打破
}
}
}
void updateRecord()
{
文件*临时文件;
字符id[9];
printf(“输入学生ID:”);
scanf(“%s”,id);
studentFile=fopen(“studentFile.bin”、“rb”);
tempFile=fopen(“tempFile.bin”、“wb”);
结构学生;
while(fread(&student,sizeof(student),1,studentFile))
{
如果(strcmp(学生id,id)==0)
{
printf(“输入更新的学生ID:”);
scanf(“%s”,学生id);
printf(“输入更新的学生姓名:”);
scanf(“%s”,学生姓名);
printf(“输入更新的电子邮件ID:”);
scanf(“%s”,student.emailId);
printf(“输入更新的课程ID:”);
scanf(“%s”,student.courseId);
printf(“输入更新等级:”);
scanf(“%s”,学生成绩);
fwrite(&student,sizeof(student),1,tempFile);
}
其他的
{
fwrite(&student,sizeof(student),1,tempFile);
}
}
fclose(学生档案);
fclose(tempFile);
删除(“studentFile.bin”);
重命名(“tempFile.bin”、“studentFile.bin”);
}
作废删除记录()
{
文件*临时文件;
结构学生;
字符名[30];
printf(“输入学生姓名:”);
scanf(“%s”,名称);
studentFile=fopen(“studentFile.bin”、“rb”);
tempFile=fopen(“tempFile.bin”、“wb”);
while(fread(&student,sizeof(student),1,studentFile))
{
if(strcmp(学生姓名)!=0)
{
fwrite(&student,sizeof(student),1,tempFile);
}
}
fclose(学生档案);
fclose(tempFile);
删除(“studentFile.bin”);
重命名(“tempFile.bin”、“studentFile.bin”);
}
这是用C写的,如果有帮助的话,我也在使用C语言。
图片贴在下面显示的是什么
@tadman:
“%s”
本身已经忽略了前导换行符。您确实不想将“\n”
添加到scanf()
格式字符串的末尾。使用%s
而不受任何长度限制与使用get()
一样糟糕。例如,您应该有scanf(“%8s”,student.id)代码>可能损坏是由以前的故障造成的