问题打印错误的char

时间:2014-10-02 04:50:27

标签: c

我一直在玩一个简单的刽子手程序(新的计算机科学专业)的想法,这个代码,虽然在逻辑上正确和工作,打印一个奇怪的字符(╠确切地说)而不是打印下划线(_)喜欢它应该。这似乎只发生在"否则如果"陈述存在。有谁知道造成这种情况的原因是什么?

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


int main(){

char w[13][3] = {
        { 'c', 'a', 't' }, //0
        { 'd', 'o', 'g' }, //1
        { 'r', 'a', 't' }, //2
        { 'e', 'e', 'l' }, //3
        { 'c', 'o', 'w' }, //4
        { 'o', 'w', 'l' }, //5
        { 'e', 'm', 'u' }, //6
        { 'b', 'a', 't' }, //7
        { 'e', 'l', 'k' }, //8
        { 'p', 'i', 'g' }, //9
        { 'b', 'e', 'e' }, //10
        { 'h', 'e', 'n' }, //11
        { 'f', 'o', 'x' }, //12
};

char u,
    dis[100];

int random;

srand(time(NULL));
random = rand() % 13;

printf("%d\n", random); //check random number
printf("Enter a letter: ");
u = getchar();

for (int i = 0; i < 3; i++){

    if (w[random][i] == u){
        dis[i] = u;
    }
    else if (w[random][i] == '_'){
        continue;
    }
    else if (w[random][i] != u && w[random][i] != '_'){
        continue;
    }
    else {
        dis[i] = '_';
    }

}

for (int i = 0; i < 3; i++){
    printf("%c", dis[i]);
}

printf("\n\n");
system("pause");
}

2 个答案:

答案 0 :(得分:2)

您的第二个else if声明,

else if (w[random][i] != u && w[random][i] != '_')

大部分时间都是真的(每当你猜不到正确的随机字母时)。由于该块中的唯一语句是continue;,因此未设置dis[i]。您的输出正在打印尚未初始化的字符。

替代实现将使用(例如)

int hangman=0;
char u;
int maxGuesses=10;

// Seed random part

while (hangman < maxGuesses) {
  printf("%d\n", random); //check random number
  printf("Enter a letter: ");
  u = getchar();

  for (i=0; i<3; i++) {
    if (w[random][i] == u) {
      // You just guessed this letter
      dis[i] = u;
    }
    else if (dis[i] != '_') { // This requires you initialise dis[...] to '_'
      // You already know this letter
      continue;
    }
    else {
      // You don't know the letter, and you guessed wrong
      hangman++;
    }
  }

  for (int i = 0; i < 3; i++){
    printf("%c", dis[i]);
  }
  drawHangman(hangman);

  for (int i = 0; i < 3; i++) {
    if(dis[i] == '_') {
      break;
    }
    // If none are == '_', then finished?
    // Go to the end of the program
  }
}

注意:如果您没有猜到任何字母,这将增加刽子手3次,并且还没有管理任何正确的猜测!这可能比预期的更严厉,所以可能会使用一个更好的增量系统 - 也许是一个bool,最初是假的,如果你做对了就设置为true?然后在你的for(i ...)循环之后,你可以只测试和增加一次,而不是在循环内。

答案 1 :(得分:1)

随机字符的显示由以下原因引起:

  1. dis未初始化。

  2. dis[i]未在_循环中的几个子句中设置为for

  3. for循环中,

    for (int i = 0; i < 3; i++){
    
        if (w[random][i] == u){
            dis[i] = u;
        }
        else if (w[random][i] == '_'){
            // Missing code to set dis[i]
            continue;
        }
        else if (w[random][i] != u && w[random][i] != '_'){
            // Missing code to set dis[i]
            continue;
        }
        else {
            dis[i] = '_';
        }
    }
    

    <强>更新

    for循环中的代码很奇怪。

        else if (w[random][i] == '_'){
    

    条件永远不会成真。您的测试用例中的所有单词都没有'_'

    根据您的数据,

    中的条件
        if (w[random][i] == u){
    

        else if (w[random][i] != u && w[random][i] != '_'){
    

    将是真的。这意味着,最后一句,

        else {
            dis[i] = '_';
        }
    

    永远不会被行使。

    我认为您的代码可以简化为:

    for (int i = 0; i < 3; i++){
    
        if (w[random][i] == u){
            dis[i] = u;
        }
        else {
            dis[i] = '_';
        }
    }