Как отмечено в моих комментариях, у вас есть две основные проблемы. Строка формата scanf ("%d/n", ...)
является неправильной, если пользователь фактически не вводит "/n"
после каждого ввода и секунды, ваша переменная цикла неинициализируется в каждом цикле for
.
Но еще большее беспокойство вызывает неудача проверить возвращение scanf
при каждом вызове, поэтому один неверный символ может привести к тому, что ваше целочисленное преобразование завершится неудачно, и вы продолжите, как будто ничего не случилось. Например, если при достижении 3
ваш пользователь случайно нажмет 'e'
, то произойдет сопоставление-сбой , извлечение символа из stdin
остановится в этой точке, и если вы зацикливаете сбор целочисленного вводаВы только что завернули в бесконечный цикл.
Всегда проверяйте каждый вход
Требуется всего лишь простая проверка, чтобы спасти себя от себя. Чтобы проверить введенные вами данные, вы можете сделать:
printf("How many students would you like to register: ");
if (scanf ("%d", &numOfStds) != 1) {
fputs ("error: invalid integer input - numOfStds.\n", stderr);
return 1;
}
и для другого примера:
for(int i = 0; i < numOfStds; i++){
printf ("Please enter student %d's number: ", i+1);
if (scanf("%d", &stdNum) != 1) {
fputs ("error: invalid integer input - stdNum.\n", stderr);
return 1;
}
students[i] = stdNum;
}
Собрать все вместе в полном примере, а затем вывести собранные значения, которые вы можете сделать:
#include <stdio.h>
int main (void) {
int numOfStds;
int numOfCrs;
int stdNum;
printf("How many students would you like to register: ");
if (scanf ("%d", &numOfStds) != 1) {
fputs ("error: invalid integer input - numOfStds.\n", stderr);
return 1;
}
printf("How many courses are in the program?: ");
if (scanf ("%d", &numOfCrs) != 1) {
fputs ("error: invalid integer input - numOfCrs.\n", stderr);
return 1;
}
int students[numOfStds];
char courses[numOfCrs][8];
for(int i = 0; i < numOfStds; i++){
printf ("Please enter student %d's number: ", i+1);
if (scanf("%d", &stdNum) != 1) {
fputs ("error: invalid integer input - stdNum.\n", stderr);
return 1;
}
students[i] = stdNum;
}
for(int i = 0; i < numOfCrs; i++){
printf("Please enter course %d's code (must be 7 characters long): ",
i+1);
if (scanf ("%7s", courses[i]) != 1) {
fputs ("error: invalid integer input - numOfCrs.\n", stderr);
return 1;
}
}
/* example output */
// int registry[numOfStds][numOfCrs];
puts ("\nStudents:");
for (int i = 0; i < numOfStds; i++)
printf ("student: %d\n", students[i]);
puts ("\nCourses:");
for (int i = 0; i < numOfCrs; i++)
printf ("course: %s\n", courses[i]);
}
( примечание: выше защиты границ вашего массива с if (scanf ("%7s", courses[i]) != 1)
, если вы не включили 7
в качестве поля модификатор ширины , ваш пользователь может ввести столько символов, сколько пожелает, что приведет к неопределенному поведению)
Пример использования / Вывод
$ ./bin/numofstds
How many students would you like to register: 3
How many courses are in the program?: 2
Please enter student 1's number: 301
Please enter student 2's number: 302
Please enter student 3's number: 303
Please enter course 1's code (must be 7 characters long): abcdefg
Please enter course 2's code (must be 7 characters long): bcdefgh
Students:
student: 301
student: 302
student: 303
Courses:
course: abcdefg
course: bcdefgh
Просмотрите всеи дайте мне знать, если у вас есть дополнительные вопросы.