1

我正在尝试创建一个程序,该程序在用户输入“roll”时打印一个随机数,如果随机数大于或等于 3,则允许用户输入“1”。

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

int main(void)
{
    int randomnumber;
    char diceinput;
    int slotnumber;
    char lettertable[7];
    char *character;

    lettertable[1] = 'l';
    lettertable[2] = 'r';
    lettertable[3] = 't';
    lettertable[4] = 'e';
    lettertable[5] = 't';
    lettertable[6] = 'e';

    character = &lettertable[1];

    printf("Enter 'roll' to roll the dice. Enter 'exit' to quit.\n");

    scanf("%s", &diceinput);

    if (strcmp(&diceinput, "exit")==0) {        
        printf("Now quitting. Thank you, and please play again!\n");        
    }

    if (strcmp(&diceinput, "roll")==0) {        
        srand((unsigned)time(NULL));
        randomnumber = rand() % 6 + 1;
        printf("%d\n", randomnumber);

        if (randomnumber >= 3) {            
            printf("Enter 1 to get the corresponding letter from table.\n");
            scanf("%d", &slotnumber);

            if (slotnumber == 1) {                
                printf("%s", character);                
            }
        }
    }
 }

用户输入“1”后,程序应该获取存储在字母表[1]中的字母,这是数组字母表中的一个元素。然而,当我运行程序并输入“1”时,输出的不是字母“l”,而是一个奇怪的短语:“lrtete”,带有一个倒置的问号。有人能帮帮我吗?谢谢你。

请注意,上面显示的代码只是未完成程序的相关部分。

4

4 回答 4

4

尝试这个

if (slotnumber == 1) 
{
        printf("%c", *character);
}

同样正如Jonathan Leffler所指出的,您的代码不会因为if (strcmp(&diceinput, "exit")==0). 您应该使用exit(0)退出;

 if (strcmp(&diceinput, "exit")==0) 
 {
      printf("Now quitting. Thank you, and please play again!\n");
      exit(0);
 }
于 2013-09-06T19:55:18.077 回答
3

如果您尝试输出一个字母,请尝试替换printf("%s" , character)printf("%c" , *character)

于 2013-09-06T19:58:14.170 回答
2

printf 函数将打印它在提供的位置找到的内容,并在找到二进制零时停止打印。你的问题在这里:

printf("%s", character);

由于数组的第二个元素不为零,因此它将继续打印,直到碰巧找到零为止。在您的情况下,您很幸运,它在打印大量垃圾之前找到了一个。

于 2013-09-06T19:55:26.867 回答
2

使用%cas inprintf("%c", *character);而不是%sinprintf("%s", character);

您的代码中有一些逻辑错误:

1)char diceinput;然后scanf("%s", &diceinput);,这是一个大错误,您的程序可能会崩溃,因为您没有为输入字符串分配足够的内存(无论是静态的还是动态的)。使用char diceinput[5];scanf("%s", diceinput);

2) 您已从1. (如果是故意的请见谅)

3)您正在使用printf("%s", character);,我会说您得到"lrtete"输出是您的运气,即它可能不会停止并在之后打印一些垃圾字符,因为字符数组的末尾..te没有明确的字符。\0

于 2013-09-06T19:57:04.900 回答