c-当我得到这个用户输入时,我做错了什么



我不明白为什么运行此程序的用户在菜单上选择#4后没有输入学生全名的选项。。。它提示输入结构的所有其他变量,但跳过第一个变量。

我只是尝试了一些随机的东西,所以我很抱歉,如果这个代码看起来一团糟,我自己现在几乎读不懂。我们不允许在这个项目中使用数组,这就是为什么我用指针做所有这些奇怪的事情。

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
// Ok, first we must make a struct that holds these things:
//  StudentID
//  Class Name
//  ClassID (like INET3101)
//  StudentFullName

struct record {
int studentID;
char *class_name;
char *classID;
char *full_name;
};
int num_rec = 0;
void add_record(struct record);
void remove_record(struct record);
void print_record(struct record);
struct record *database;

void add_record(struct record addTemp){
num_rec++;
if (num_rec ==1) {
database = malloc(sizeof(struct record));
memcpy(database, &addTemp, sizeof(struct record));
}
else {
struct record *tempMem = malloc(sizeof(struct record) * num_rec);
struct record *mover = database;
struct record *head = tempMem;
int i;
for (i=0; i< num_rec; i++){
memcpy(tempMem++, mover++, sizeof(struct record));  
}
memcpy(--tempMem, &addTemp, sizeof(struct record));
free(database);
database = head;
}
}
void remove_record(struct record removeTemp){
if (num_rec == 0){
printf("There is nothing to delete here!");
return;
}
else{
struct record *tempMem= malloc(sizeof(struct record) * num_rec-1);
struct record *mover = database;
struct record *head = tempMem;
int i;
for (i = 0; i < num_rec-1; i++){
memcpy(tempMem, &removeTemp, sizeof(struct record));
}
memcpy(--tempMem, &removeTemp, sizeof(struct record));
free(database);
database = head;
num_rec--;
}
}

void printRecords(){
int i;
for(i = 0; i < num_rec; i++) {  
int k = i + 1;
printf("Student #%dn", k);
fprintf(stderr, "Student full name: %sn", (database + i)->full_name);
fprintf(stderr, "Student ID: %dn", (database + i)->studentID);
fprintf(stderr, "Class name: %sn", (database + i)->class_name);
fprintf(stderr, "Class ID: %sn", (database)->classID);
printf("n");
}
}


// }

// 1. print all records
// 2. print number of records
// 3. print size of database
// 4. add record
// 5. delete record
// 6. print number of accesses to a database
// 7. exit

int main(){
int BUFSIZE = 100;
struct record ultimate;
static int accesses=0; 
int choice=0;
while (true) {
printf("1. print all records n");
printf("2. print number of records n");
printf("3. print size of database n");
printf("4. add record n");
printf("5. delete record n");
printf("6. print number of accesses to a database n");
printf("7. exit n");
scanf("%d", &choice);

switch (choice){
case 1: 
;

printf("This is our current database of records: ");
if (num_rec == 0){
printf("Oh... It looks like the data base is currently empty.n");
accesses++;
break;
}
else{
printRecords();
accesses++;
break;
}

case 2:
;
printf("The current number of student records is: %d recordsn", num_rec);
accesses++;

// 3. print size of database
case 3:
;
int size_database;
int size_struct = sizeof(struct record);
size_database = size_struct * num_rec;
printf("The size of our database is %in", size_database);
break;

// 4. add record
case 4:
;
char *buf1 = (char*) malloc(BUFSIZE);
char *buf2 = (char*) malloc(BUFSIZE);
char *buf3 = (char*) malloc(BUFSIZE);
char *buf4 = (char*) malloc(BUFSIZE);


struct record ultimat;

printf("Please enter this students Full Name: n");
fgets(buf1, BUFSIZE, stdin);
if ((strlen(buf1) > 0) && (buf1[strlen (buf1) - 1] == 'n'))
buf1[strlen (buf1) - 1] = '';
ultimat.full_name = malloc(strlen(buf1)+1);
strcpy(ultimat.full_name, buf1);
int id;
printf("Please enter this students Student ID: n");
fgets(buf2, BUFSIZE, stdin);
if ((strlen(buf2) > 0) && (buf2[strlen (buf2) - 1] == 'n'))
buf2[strlen (buf2) - 1] = '';
ultimat.studentID = id;
printf("Please enter the Class Name: n");
fgets(buf3, BUFSIZE, stdin);
if ((strlen(buf3) > 0) && (buf3[strlen (buf3) - 1] == 'n'))
buf3[strlen (buf3) - 1] = '';
ultimat.class_name = malloc(strlen(buf3)+1);
strcpy(ultimat.class_name, buf3);
printf("Please enter this students Class ID: n");
fgets(buf4, BUFSIZE, stdin);
if ((strlen(buf4) > 0) && (buf4[strlen (buf4) - 1] == 'n'))
buf4[strlen (buf4) - 1] = '';
ultimat.classID = malloc(strlen(buf4)+1);
strcpy(ultimat.classID, buf4);
add_record(ultimat);
printf("Alright, I added this student to the database! n");

free(buf1);
free(buf2);
free(buf3);
free(buf4);

accesses++;
break;

// 5. delete record
case 5:
;
remove_record(ultimate);
printf("Alright! I got the student at the top of the list deleted! n");
break;
// 6. print number of accesses to a database
case 6:
;
printf("The current number of data base accesses is: %d acessesn", accesses);
break;
case 7:
exit(0);
}
}return 0;
}

调用scanf之后

scanf("%d", &choice);

输入缓冲区包含需要在第一次调用fgets之前删除的换行符'n'

fgets(buf1, BUFSIZE, stdin);

否则将输入一个空字符串。

例如,你可以用以下方法

while (getchar() != 'n');

相关内容

最新更新