gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:20:40 24 4
gpt4 key购买 nike

几天前我开始学习 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 和编程本身仍然非常不熟悉。

最佳答案

您调用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 中的任何空白字符,然后将最多 79 个字节的字读入 start 指向的数组中。没有 79 , scanf如果标准输入包含很长的字,则无法判断何时停止,并且可能导致缓冲区溢出。攻击者可以利用这个流程让您的程序运行任意代码。

这是代码的修改版本:

#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;
}

关于c - 为什么这会给我一个逻辑错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com