繁体   English   中英

如何将字符串和整数添加到数组然后打印到文本文件

[英]How to add strings and integers to an array then print to a text file

再见,当我输入学生的名字时,程序立即崩溃。 此外,我不确定如何将名称和 ID 添加到数组中以打印到文本文件。 请问我有什么帮助吗?

struct records{
    int id;
    char fname[15];
    char lname[15];
    };
struct records student;


 int max=1000;
        int i;
        srand( time(NULL) ); //random numbers generated
        ATND= fopen("Student Record.txt","a");
        if(ATND== NULL){
            printf("ERROR!");       
            exit(1);
        }
        for(i=0; i<100; i++){
        printf("Enter student\'s first name: ");
        scanf("%s", student.fname[i]);

        printf("\n\n");
        printf("Enter student\'s last name: ");
        scanf("%s", student.lname[i]);

        /*randomnumber*/student.id[i]=rand() %max + 39048543;

        fprintf(ATND,"%s %s %d", student.fname[i], student.lname[i], student.id[i]);
    }
        fclose(ATND);

代码只为 1 条记录提供数据空间,而它似乎需要 1000 条记录。 其他问题的数量。 怀疑 10 小时后,OP 已经处理了其中的一些

//Definition - good
struct records {
  int id;
  char fname[15];  // IMO 15 is too limiting for first and last
  char lname[15];
};

// Only 1 student, need many more
// struct records student;
#define STUDENT_N 1000
struct records student[STUDENT_N];

void read_records(void) {
  // avoid magic numbers
  // int max = 1000;
  int max = STUDENT_N;

  int i;
  srand(time(NULL)); //random numbers generated

  // ATND not declared
  FILE *ATND;

  ATND = fopen("Student Record.txt", "a");
  if (ATND == NULL) {
    printf("ERROR!");
    exit(1);
  }

  char buf[100];

  // avoid magic numbers
  // for (i = 0; i < 100; i++) {
  for (i = 0; i < STUDENT_N; i++) {

    printf("Enter student\'s first name: ");
    // don't use scanf()
    // scanf("%s", student.fname[i]);
    if (fgets(buf, sizeof buf, stdin) == NULL) break;
    if (sscanf(buf, "%14s", student[i].fname) != 1) break;

    printf("\n\n");
    printf("Enter student\'s last name: ");
    // Add flush to insure buffered prompts that do not end in \n are sent
    fflush(stdout);

    // scanf("%s", student.lname[i]);
    if (fgets(buf, sizeof buf, stdin) == NULL) break;
    if (sscanf(buf, "%14s", student[i].lname) != 1) break;

    // /*randomnumber*/student.id[i] = rand() % max + 39048543;
    /*randomnumber*/student[i].id = rand() % max + 39048543;

    // Do not index the name, index the structure
    // fprintf(ATND, "%s %s %d", student.fname[i], student.lname[i],    student.id[i]);
    fprintf(ATND, "%s %s %d", student[i].fname, student[i].lname,  student[i].id);
  }
  fclose(ATND);
}

假设 student.fname 是一个足够大的字符数组

    scanf("%s", student.fname[i]);

应该

scanf("%s", student.fname);

您需要一个指向数组开头的指针,而不是字符的值,一一传递。 scanf 将在一次调用中输入整个名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM