gpt4 book ai didi

c - 输入继续

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:38 24 4
gpt4 key购买 nike

所以,我看了几个问同样问题的帖子,但没有一个对我有用。好吧,他们半途而废,就像当我不在这里做我正在做的事情时他们工作一样。我想要做的是让它显示几行文本,要求输入以继续,并显示更多文本,这样它不仅会给你一个巨大的文本墙来一次阅读所有内容。

这是我所拥有的一切,我将标记我尝试等待输入的地方。如果它有所作为,我会在 Windows 上。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<process.h>
#include<conio.h>
#include<ctype.h>


//void playerName (char* playername){
//FILE* playerNameFile = fopen("player.data","w");
//fprintf(playerNameFile, "%s", playerName);
//}


int main(){
char response;
char playername[20];
char enter = 0; //For Enter
system("cls");
printf("Would you like to embark on an adventure?\n Y/N?:\n\n\n\n");
response = toupper(getch());
if (response=='Y'){
printf("Before we start, what's your name?\n Your name is: ");
scanf("%s",playername);
printf("%s, Story Text.\n");
printf("Story Text\n");
printf("Story Text.\n");
printf("Story Text\n");
printf("Story Text\n");
printf("Press enter to continue\n");
while (enter != '\r' && enter != '\n') { enter = getchar(); } //For Enter
printf("Story Text\n");
printf("Story Text\n");
printf("Story Text");
printf("Story Text \n");
printf("Story Text\n");
printf("Story Text\n");
printf("Story Text\n");
printf("Press enter to continue\n");
while (enter != '\r' && enter != '\n') { enter = getchar(); } //For Enter
printf("Story Text\n");
printf("Story Text\n\n");
printf("Story Text\n");
printf("Story Text\n");
}
else if (response=='N'){
printf("Well, I'll see you later then!");
exit(0);
}

printf("Embark on your quest?\n Y/N?");
response = toupper(getch());
if (response=='Y'){
system("cls");
printf("'\nStory Text\n");
printf("'Story Text\n");
printf("The end for now");
}
else if (response=='N'){
printf("Come back when you are ready to embark on your quest.");
exit(0);
}


return 0;
}

我假设 while 部分是它的问题,但我想不出一种方法让它在我得到的条件下工作。有办法做到这一点吗?

最佳答案

getchar() 从键盘读取用户输入的一个字符时,输入流中可能会留下额外的字符。在尝试再次阅读之前,您需要丢弃这些额外的字符。

一开始我没有注意到对 scanf() 的调用(您的程序将受益于一些空白以提高可读性),但是 scanf() 会将字符留在输入流也是如此。由于这个原因,将 scanf()getchar() 结合起来总是很棘手,最好的解决方案可能是使用 fgets()所有用户输入。

但是,为避免过多更改输入代码,您可以坚持使用 scanf()getchar()。由于您需要在 scanf()getchar() 之后清除输入流,因此最好编写一个函数 clear_stream() :

void clear_stream(void)
{
int c;
while ((c = getchar()) != '\n' && c != EOF) {
continue;
}
}

这可以合并到函数 get_single_char() 中,也可以在调用 scanf() 后单独使用,以清除输入流。当您调用 clear_stream() 时,输入流中必须至少有一个字符,否则该函数将等待更多的输入。 C 标准 (C11 §7.21.5.2 2) 明确不允许使用 fflush(stdin) 清除输入流。 Windows 系统为此定义了行为,但它不可移植(例如,不能在 Linux 上运行)。 You can read more about this issue here .

这是一个玩具示例。请注意在调用 scanf() 时使用宽度规范以避免缓冲区溢出。

#include <stdio.h>

int get_single_char(void);
void clear_stream(void);

int main(void)
{
int choice;
char name[100];

printf("Enter name: ");
scanf("%99s", name);
clear_stream();

printf("Play a game, %s (y/n)? ", name);
choice = get_single_char();

if (choice == 'y') {
printf("Press ENTER to continue:");
get_single_char();
} else {
puts("That was uninspiring!");
}

puts("bye");
return 0;
}

int get_single_char(void)
{
int input;

input = getchar();

if (input != '\n') {
clear_stream();
}

return input;
}

void clear_stream(void)
{
int c;
while ((c = getchar()) != '\n' && c != EOF) {
continue; // discard extra characters
}
}

关于c - 输入继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41928805/

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