为什么这会给我一个逻辑错误?

时间:2016-03-08 13:52:17

标签: c

我几天前开始学习C,现在已经涵盖了基础知识,我试图制作一个基于文本的小游戏。

在制作此菜单功能后,我尝试运行我的应用程序,由于某种原因,它无法正常工作:

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

int menu() {
    char *start;
    printf("Welcome to my game\n Type START to begin or EXIT to quit: ");

    while (strcmp(start, "start") != 0 && strcmp(start, "exit") != 0) {
        scanf("%s", &start);

        if (strcmp(start, "start") == 0) {
            return 1;
        } else
        if (strcmp(start, "exit") == 0) {
            return 0;
        } else {
            printf("Invalid command. Try again: ");
        }
    }
}

请不要过于技术性地回答你的答案,因为我对C和编程本身仍然非常不熟悉。

2 个答案:

答案 0 :(得分:1)

使用指向scanf("%s",...)的指针的地址调用char*,这不是正确的类型,并且无论如何都不会初始化指针。您应该使start成为一个数组并以这种方式调用scanf

char start[80];

if (scanf("%79s", start) == 1) {
    /* word was read, check its value */
} else {
    /* no word was read, probably at end of file */
}

scanf("%79s, start)读取并忽略来自stdin的任何空格字符,然后在start指向的数组中读取最多79个字节的单词。如果没有79scanf将无法判断何时停止,如果标准输入包含非常长的单词,则可能导致缓冲区溢出。这是攻击者可以利用的流程,使您的程序运行任意代码。

以下是您的代码的修改版本:

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

int menu(void) {
    char start[80];

    printf("Welcome to my game\n Type START to begin or EXIT to quit: ");

    for (;;) {
        if (scanf("%79s", start) != 1) {
            break;

        if (strcmp(start, "start") == 0) {
            return 1;
        } else
        if (strcmp(start, "exit") == 0) {
            return 0;
        } else {
            printf("Invalid command. Try again: ");
        }
    }
    printf("unexpected end of file\n");
    return -1;
}

答案 1 :(得分:1)

您在此代码中的错误在于您将char * start与某些内容(开始或退出)进行比较,甚至没有启动它。

首先,将一个输入值分配给* start,然后继续进行比较。

额外的提示是将您的“输入词”放入小写,因为您将它与“start”和“exit”进行比较,这两个都是小写的,如果你让“开始”代替“开始”。 检查ascii表以了解我在说什么。