C中指向数组元素的指针

时间:2013-09-06 19:50:27

标签: c arrays pointers

我正在尝试创建一个程序,只要用户输入“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 个答案:

答案 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字符。

相关问题