将字符分配给嵌套循环中的字符变量在 c 中不起作用

Assigning character to a character variable in a nested loop does not work in c

我正在编写代码来生成大学作业的随机排名。程序看起来像这样:

#include <conio.h>
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

char rankgen()
{
  char rank;
  int randnum = (rand() % 13) + 1;
  // printf("randnum: %d\n", randnum);

  if (randnum != 1 || randnum != 11 || randnum != 12 || randnum != 13
      || randnum != 10) {
    rank = randnum + '0';
  } else {
    if (randnum == 10)
      rank = 1 + '0';
    else if (randnum == 1)
      rank = 'A';
    else if (randnum == 11)
      rank = 'J';
    else if (randnum == 12)
      rank = 'Q';
    else if (randnum == 13)
      rank = 'K';
  }
  return rank;
}

char rankgen2()
{
  char rank;
  int randnum = (rand() % 13) + 1;
  // printf("randnum: %d\n", randnum);

  if (randnum != 1 || randnum != 11 || randnum != 12 || randnum != 13
      || randnum != 10) {
    rank = randnum + '0';
  }
  if (randnum == 10)
    rank = 1 + '0';
  if (randnum == 1)
    rank = 'A';
  if (randnum == 11)
    rank = 'J';
  if (randnum == 12)
    rank = 'Q';
  if (randnum == 13)
    rank = 'K';
  return rank;
}

int main()
{
  srand(time(NULL));
  for (int i = 0; i < 30; i++) {
    char rank = rankgen();
    char rank2 = rankgen2();
    printf("%c, %c\n", rank, rank2);
  }
  return 0;
}

当使用嵌套循环或在 if-else 语句中时,我似乎无法将 char 赋值给 char 变量。我可以通过使其不在任何循环或任何语句中来暂时解决这个问题。如果您解释为什么会发生以及如何解决它,将会有很大帮助。

例如这个if语句

  if (randnum != 1 || randnum != 11 || randnum != 12 || randnum != 13
      || randnum != 10) {
    rank = randnum + '0';
  } else {
    if (randnum == 10)
      rank = 1 + '0';
    else if (randnum == 1)
      rank = 'A';
    else if (randnum == 11)
      rank = 'J';
    else if (randnum == 12)
      rank = 'Q';
    else if (randnum == 13)
      rank = 'K';
  }

没有意义。

在任何情况下第一个 if 语句的变量 randnum 中存储什么值并不重要

  if (randnum != 1 || randnum != 11 || randnum != 12 || randnum != 13
      || randnum != 10) {
    rank = randnum + '0';

将获得控制权。

你的意思好像是

  if (randnum != 1 && randnum != 11 && randnum != 12 && randnum != 13
      && randnum != 10) {

此外,定义两个相同的函数也没有什么意义。

您只需要一个 rankgen 函数(因为它们都做完全相同的事情),它应该看起来像这样:

char rankgen()
{
    char rank;
    int randnum = (rand() % 13) + 1;

    if (randnum == 1)
        rank = 'A';
    else if (randnum == 10)
        rank = 'T';
    else if (randnum == 11)
        rank = 'J';
    else if (randnum == 12)
        rank = 'Q';
    else if (randnum == 13)
        rank = 'K';
    else
        rank = randnum + '0';
    return rank;
}

请注意,正如@EugeneSh 所指出的,最初的 if 陈述是错误的;由于没有任何值可以等于多个不同的值,因此它始终为假。因此,大多数时候你 return 是 rank 中的垃圾值。另外,我不确定你的 == 10 案例是什么意思,但我将其更改为字符 'T'(表示“十”)。

您也可以使用这样的 switch 语句来执行此操作:

char rankgen()
{
    char rank;
    int randnum = (rand() % 13) + 1;

    switch (randnum) {
        case 1:
            rank = 'A';
            break;
        case 10:
            rank = 'T';
            break;
        case 11:
            rank = 'J';
            break;
        case 12:
            rank = 'Q';
            break;
        case 13:
            rank = 'K';
            break;
        default:
            rank = randnum + '0';
            break;
    }
    return rank;
}