为什么while循环无法正常工作?

时间:2019-07-09 17:50:14

标签: c loops random srand

我编写了一些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 个答案:

答案 0 :(得分:4)

存在多个问题:

  • 5'5'是不同的东西。 '5'是字符值,而5是数字值。字符值取决于字符编码,在当前系统上很可能是ASCII,其中'5'的数字值为530x35)。
  • C标准保证字符数字'0''9'是连续的,因此您可以通过在随机数上加上'0'来绘制字符数字。
  • 您应在flag循环之前将1设置为for,并仅在找到字符时将其清除。
  • 请注意,您在01234之间绘制了一个字符。您可能希望包括所有字符数字?

这是修改后的版本:

#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;
}