我正在尝试创建一个程序,只要用户输入“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”带有颠倒的问号。有人能帮帮我吗?谢谢。
请注意,上面显示的代码只是未完成程序的一个重要部分。
答案 0 :(得分: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);
}
答案 1 :(得分:3)
如果您尝试输出一个字母,请尝试将printf("%s" , character)
替换为printf("%c" , *character)
答案 2 :(得分:2)
printf函数将在所提供的位置打印它找到的内容,并且 在找到二进制零 时停止打印。你的问题在这里:
printf("%s", character);
由于数组的第二个元素不为零,它将继续打印,直到它找到零。在你的情况下,你很幸运,它在打印大量垃圾之前找到了一个。
答案 3 :(得分:2)
在%c
中使用printf("%c", *character);
而不是%s
中的printf("%s", character);
您的代码中存在一些逻辑错误:
1)char diceinput;
然后scanf("%s", &diceinput);
,这是一个很大的错误,您的程序可能会崩溃,因为您没有为输入字符串分配足够的内存(静态或动态)。使用char diceinput[5];
和scanf("%s", diceinput);
2)您已开始从1
建立索引。 (请原谅我的故意)
3)你正在使用printf("%s", character);
,我会说你的运气是"lrtete"
作为输出,即它可能不会停在..te
并打印一些垃圾字符后,因为字符数组末尾没有明确的\0
字符。