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);

Обратите внимание на изменение местоположения переменной цикла остановки и ее значений во второй версии.

Другие вопросы по тегам