C - Бесконечный цикл в цикле Do while
Мне нужно пройти цикл до конца, но компилятор продолжает цикл, даже когда i>=k, и я не могу выйти из бесконечного цикла. Что не так с этим фрагментом?
int i=0;
User signed_up[k]
char input_user[15];
bool stop_cycle=false;
do {
printf("\n\n%*sUsername: ", 26, "");
fflush(stdin);
scanf("%s", input_user);
stop_cycle=true;
for (i=0;i<k;i++) {
if (strcmp(input_user, signed_up[i].username)==0) {
printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
}
stop_cycle=false;
}
} while (!stop_cycle);
Изменить: k является счетчиком, который увеличивается при регистрации подпрограммы при каждом запуске. На этом этапе кода это может быть 0, 1 и т. Д. Я пытаюсь добиться того, чтобы каждый раз, когда я вставляю уже существующее имя пользователя, вставлял его снова, пока поиск в массиве не закончится.
2 ответа
ТЛ; др
int i=0;
User signed_up[k];
char input_user[15];
bool stop_cycle=false;
do {
printf("\n\n%*sUsername: ", 26, "");
fflush(stdin);
scanf("%s", input_user);
stop_cycle=true;
for (i=0;i<k;i++) {
if (strcmp(input_user, signed_up[i].username)==0) {
printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
stop_cycle=false;
}
}
} while (!stop_cycle);
Более длинное объяснение
Если это ваша ситуация...
Итак, вы хотите попросить их ввести имя пользователя.
Если имя пользователя существует, вы хотите задать его еще раз (ввести другое имя пользователя), а также вывести "Имя пользователя insertito già Presente Nel Database!"
Вы хотите продолжать делать это, пока пользователь не введет имя пользователя, которого нет в "базе данных".
Цель for
Цикл должен проверить, есть ли имя пользователя (input_user
) уже находится в "базе данных" (то есть массив, signed_up
).
Переменная k
это подсчет количества User
объекты в signed_up
массив.
Таким образом for
цикл перебирает все значения в signed_up
массив для проверки input_user
соответствует username
член User
Объект в массиве.
Если input_user
соответствует существующему username
из User
Вы хотите продолжить цикл в do while
петля.
настройка stop_cycle
в true
остановит цикл.
Затем...
Ваша проблема в том, что вы хотите установить только stop_cycle=false;
когда input_user
соответствует username
, Это единственный раз, когда вы не останавливаете цикл (т.е. stop_cycle=false;
)
Ошибка в том, что вы положили stop_cycle=false;
за пределами if
заявление. Должно быть внутри if
заявление. Это продолжит "цикл", пока имя пользователя уже существует.
Итак, этот код работает:
int i=0;
User signed_up[k];
char input_user[15];
bool stop_cycle=false;
do {
printf("\n\n%*sUsername: ", 26, "");
fflush(stdin);
scanf("%s", input_user);
stop_cycle=true;
for (i=0;i<k;i++) {
if (strcmp(input_user, signed_up[i].username)==0) {
printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
stop_cycle=false;
}
}
} while (!stop_cycle);
Другие советы
В дополнение к предложениям других людей, мой совет:
переименовывать stop_cycle
в username_exists
, а также k
в num_users
,
Итак, код выглядит так:
int i=0;
User signed_up[num_users];
char input_user[15];
bool username_exists=false;
do {
printf("\n\n%*sUsername: ", 26, "");
fflush(stdin);
scanf("%s", input_user);
username_exists=false;
for (i=0;i<num_users;i++) {
if (strcmp(input_user, signed_up[i].username)==0) {
printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
username_exists=true;
}
}
} while (username_exists);
Это дает понять, что ваш for
цикл проверяет, существует ли имя пользователя, и дает понять, что ваш do
Цикл будет продолжаться, пока существует имя пользователя. Это также дает понять, что k
представляет количество пользователей.
Что именно вы пытаетесь сделать здесь?
Шаги, выполняемые вашим кодом, сбрасывают переменную i в 0 в каждой итерации do, а также устанавливают для stop_cycle значения true и false в каждой итерации.
Цикл for на каждой итерации do выполняется от i=0 до i Вы заканчиваете do, устанавливая цикл остановки в false каждый раз, чтобы время не срабатывало. Попробуйте запустить это как: или же Обратите внимание на изменение местоположения переменной цикла остановки и ее значений во второй версии.printf("\n\n%*sUsername: ", 26, "");
fflush(stdin);
scanf("%s", input_user);
for (i=0;i<k;i++) {
if (strcmp(input_user, signed_up[i].username)==0) {
printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
}
}
int i=0;
User signed_up[k]
char input_user[15];
bool stop_cycle=true;
do {
printf("\n\n%*sUsername: ", 26, "");
fflush(stdin);
scanf("%s", input_user);
stop_cycle=true;
for (i=0;i<k;i++) {
if (strcmp(input_user, signed_up[i].username)==0) {
printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
stop_cycle=false;
}
}
} while (stop_cycle);