0

我是 C 新手,我正在尝试实现一个结构数组。但是由于某种原因,当我尝试通过将数组结构打印到控制台来访问数组结构中的数据时,我似乎无法理解它,它根本不会执行。这是在windows环境下发生的,所以我改了,去了linux。它只是提出分段错误并停止。我已经四处寻找,似乎我的语法是正确的,但我似乎无法摆脱错误。我访问的一个网站是https://www.javatpoint.com/array-of-structures-in-c但我的代码仍然无法正常工作。这是我的 C 文件。

#include <stdio.h>
#include <string.h>

struct student {
  char registration_number[15];
  char forename[20];
  char surname[25];
  char department[60];
  char gender;
};

int main(void) { 
  struct student student_record[5];
  int i;
  for (i = 0; i < 5; i++) {
    printf("Student %i", i);
    printf("\nInput student forename: ");
    scanf("%s",&student_record[i].forename);
    printf("\nInput student surname: ");
    scanf("%s",&student_record[i].surname);
    printf("\nInput student registration number: ");
    scanf("%s",&student_record[i].registration_number);
    printf("\nInput student department: ");
    scanf("%s",&student_record[i].department);
    printf("\nInput student gender: ");
    scanf("%s",&student_record[i].gender);
    printf("\n");
  }

  printf("Reg No. \t First Name \t Last Name \t Gender \t Department \n");
  for (int i = 0; i < 5; i++) {
    printf("%s \t %s \t %s \t %s \t %s \n", student_record[i].registration_number, student_record[i].forename, student_record[i].surname, student_record[i].gender, student_record[i].department );
  }
} 

任何帮助,将不胜感激。

4

2 回答 2

0

scanf("%s",&student_record[i].gender); =>scanf("%c",&student_record[i].gender);

printf("%s \t %s \t %s \t %c \t %s \n", /*cut*/, student_record[i].gender, student_record[i].department );
于 2021-01-09T17:00:10.597 回答
0

您的代码中有几个问题。

期望将scanf()指针和类型数组转换为类型指针,但此规则很少有例外,其中之一是使用一元运算符时,&即当将其传递&student_record[i].forenamescanf()它时不会转换为指针。参数的类型&student_record[i].forenamechar (*)[20]并且带有%s格式说明符,scanf()需要char *类型参数。
因此,当将数组传递给 时scanf(),您不需要给&. %s您还应该在格式字符串中指定转换说明符的最大字段宽度,scanf()以确保它不应访问超出其大小的缓冲区。最大字段宽度应比数组大小小一以容纳终止空字节。它应该是:

    scanf("%19s", student_record[i].forename);
    scanf("%24s", student_record[i].surname);
    scanf("%14s", student_record[i].registration_number);
    scanf("%59s", student_record[i].department);

结构gender成员的类型是并且您正在使用格式说明符来读取它。这将导致未定义的行为,因为在将字符串读取到缓冲区时添加终止空字符。由于字段大小是一个字节,因此最终访问的内存超出了字段大小。您应该使用格式说明符来读取字段值。转换说明符不会自动跳过任何前导空格,因此如果输入流中有一个杂散的换行符(来自上一个条目),调用将立即使用它。解决此问题的一种方法是在传递给的格式字符串中的转换说明符之前放置一个空格studentchar%sscanf()scanf()genderscanf()gender%cscanf()gender%cscanf()scanf().

    scanf(" %c", &student_record[i].gender);

确保为gender字段提供正确的格式说明符printf()

    printf("%s \t %s \t %s \t %c \t %s \n", student_record[i].registration_number, student_record[i].forename, student_record[i].surname, student_record[i].gender, student_record[i].department );
                             ^^^^

此外,您打印列名和结构字段的方式,输出可能没有正确对齐。相反,您应该使用带有格式说明符的宽度并将其左对齐(有关此方面的更多信息,请参阅一些很好的家庭功能printf()参考资料),如下所示:printf()

  printf("%-15s %-20s %-25s %-6s %-60s \n", "Reg No.", "First Name", "Last Name", "Gender", "Department");
  for (int i = 0; i < 5; i++) {
    printf("%-15s %-20s %-25s %-6c %-60s \n", student_record[i].registration_number, student_record[i].forename, student_record[i].surname, student_record[i].gender, student_record[i].department );
  }
于 2021-01-09T17:45:48.177 回答