Почему цикл while работает неправильно? - PullRequest
1 голос
/ 09 июля 2019

Я написал некоторый C-код для генерации случайного символа и проверки, существует ли этот символ в массиве.Если он существует, я хочу создать новый символ.Я использую флаг в качестве индикатора и использую цикл do / while для проверки этого флага, но, к сожалению, код не работает должным образом, и я получаю символ, который уже существует в массиве.

Мне нужна ваша помощь, чтобы понять и решить эту проблему.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    char c;
    int num;
    int flag = -1;
    char temp[5] = { '3', '2', '5', '9', '1' };
    srand(time(NULL));
    do {
        num = rand() % 5;
        c = num;
        for (int i = 0; i < 5; i++) {
            if (temp[i] == c) {
                flag = 0;
                break;
            } else {
                flag = 1;
            }
        }
    } while (0 == flag);

    printf("number is : %d\n", c);
    return 0;
}

1 Ответ

4 голосов
/ 09 июля 2019

Есть несколько проблем:

  • 5 и '5' - это не одно и то же.'5' является символьным значением, тогда как 5 является числовым значением.Значения символов зависят от кодировки символов, наиболее вероятно ASCII в современных системах, где '5' имеет числовое значение 53 (0x35).
  • Стандарт C гарантирует, что цифры символа '0''9' являются смежными, поэтому вы можете нарисовать символьную цифру, добавив '0' к случайному числу.
  • вам следует установить flag в 1 перед циклом for и очистить его толькокогда вы найдете символ.
  • обратите внимание, что вы рисуете символ из 0, 1, 2, 3 и 4.Вместо этого вы можете включить все цифры символов?

Вот модифицированная версия:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    char temp[] = { '3', '2', '5', '9', '1' };
    const size_t temp_len = sizeof(temp) / sizeof(temp[0]);
    char c;
    int flag;

    srand(time(NULL));

    do {
        // select a random digit character 
        c = '0' + rand() % 10;
        flag = 1;
        for (size_t i = 0; i < temp_len; i++) {
            if (temp[i] == c) {
                flag = 0;
                break;
            }
        }
    } while (flag == 0);

    printf("character is: %c\n", c);
    return 0;
}

Обратите внимание, что вы можете использовать memchr() для поиска символа и избегать использования do / while петли, которые могут вызвать путаницу.Вот более простая альтернатива:

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

int main() {
    char temp[] = { '3', '2', '5', '9', '1' };
    char c;

    srand(time(NULL));

    for (;;) {
        // select a random digit character 
        c = '0' + rand() % 10;
        if (!memchr(temp, c, sizeof temp))
            break;
    }
    printf("character is: %c\n", c);
    return 0;
}
...