scanf 输出中的奇怪字符
Bizarre characters in scanf output
我正在编写一个用于小型 C 程序的函数。该函数应该提示用户输入 n
7 位字母数字课程代码字符串,以及 return 这些字符串作为数组。我已经编写了一个我认为应该这样做的函数,但是我遇到了一些错误。
char ** getNCourses(int n) {
char **courses;
courses = malloc(n * sizeof(char));
for (int i=0; i<n; i++) {
printf(INQUIRY_COURSE_CODE"\n", i);
courses[i] = malloc(8);
scanf("%7s", courses[i]);
flush();
}
return courses;
}
我有几行代码来打印所述数组的结果:
// prompt the user for course codes
char **pCourses;
pCourses = getNCourses(MAX_COURSES);
for (int i=0; i<MAX_COURSES; i++) {
printf("%s ", pCourses[i]);
}
这里是程序的输出 运行。可以看出,输出的课程代码“已损坏”:
Registering 10 courses.
Please enter the 7-digit course code for course 0:
CST8101
Please enter the 7-digit course code for course 1:
CST8102
[...]
CST8109
Please enter the 7-digit course code for course 9:
CST8110
�@�� CST8102 �@�� �@�� �@�� CST8106 CST8107 CST8108 CST8109 CST8110 %
我不确定为什么有些课程代码显示没有问题,而另一些则完全不正确。我相信这不是读取数据的问题,而是实际分配内存和 returning 数组的问题,但我不知所措。
char **courses;
courses = malloc(n * sizeof(char));
courses
指向 char *
。每个 char *
需要 sizeof (char *)
字节,而不是 sizeof (char)
字节。 n
个需要 n * sizeof (char *)
个字节。
你可以通过总是写 Pointer = malloc(n * sizeof *Pointer);
来避免这样的错误。然后 sizeof *Pointer
总是产生所指向类型的大小;你永远不必推断类型。它还会自动调整声明更改:如果编辑代码以更改指针的声明,sizeof
仍然是正确的,因为它使用指针来获取类型,而不是硬编码类型。
我正在编写一个用于小型 C 程序的函数。该函数应该提示用户输入 n
7 位字母数字课程代码字符串,以及 return 这些字符串作为数组。我已经编写了一个我认为应该这样做的函数,但是我遇到了一些错误。
char ** getNCourses(int n) {
char **courses;
courses = malloc(n * sizeof(char));
for (int i=0; i<n; i++) {
printf(INQUIRY_COURSE_CODE"\n", i);
courses[i] = malloc(8);
scanf("%7s", courses[i]);
flush();
}
return courses;
}
我有几行代码来打印所述数组的结果:
// prompt the user for course codes
char **pCourses;
pCourses = getNCourses(MAX_COURSES);
for (int i=0; i<MAX_COURSES; i++) {
printf("%s ", pCourses[i]);
}
这里是程序的输出 运行。可以看出,输出的课程代码“已损坏”:
Registering 10 courses.
Please enter the 7-digit course code for course 0:
CST8101
Please enter the 7-digit course code for course 1:
CST8102
[...]
CST8109
Please enter the 7-digit course code for course 9:
CST8110
�@�� CST8102 �@�� �@�� �@�� CST8106 CST8107 CST8108 CST8109 CST8110 %
我不确定为什么有些课程代码显示没有问题,而另一些则完全不正确。我相信这不是读取数据的问题,而是实际分配内存和 returning 数组的问题,但我不知所措。
char **courses;
courses = malloc(n * sizeof(char));
courses
指向 char *
。每个 char *
需要 sizeof (char *)
字节,而不是 sizeof (char)
字节。 n
个需要 n * sizeof (char *)
个字节。
你可以通过总是写 Pointer = malloc(n * sizeof *Pointer);
来避免这样的错误。然后 sizeof *Pointer
总是产生所指向类型的大小;你永远不必推断类型。它还会自动调整声明更改:如果编辑代码以更改指针的声明,sizeof
仍然是正确的,因为它使用指针来获取类型,而不是硬编码类型。