提问人:Eminion 提问时间:7/5/2023 更新时间:7/6/2023 访问量:94
用 C 语言编写的基于文本的游戏的名称比较 [duplicate]
Name comparisson for text based game written in C [duplicate]
问:
所以,我正在尝试制作一个基于文本的游戏来帮助人们学习 linux,我正在努力做到这一点,如果你的名字是 Linus Torvalds,而不是你的指南是 Linus Torvalds,那将是 Richard Stallman,问题是输入任何名字,打印屏幕都会显示指南是 Richard Stallman。 (顺便说一句,使用 C 顺便说一句)
在这里编码:
<!--语言:c -->
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Global variables
char name[15];
char yesno[1];
//Main
int main(){
system("clear");
printf("???: Hello adventurer, are you here to learn Linux?\n");
printf("y/n\n");
scanf("%c", yesno);
if (strcmp("n", yesno)){
printf("???: Great!, What is your name?\n");
scanf("%s", name);
if("Linus Torvalds\n"){
printf("Achievment complete: In God We Trust\n");
printf("Nice to meet you!, my name is Richard Stallman.\n");
}else {
printf("Nice to meet you!, my name is Linus Torvalds.\n");
}
}
else if (strcmp("y", yesno)){
printf("Ok!, bye!");
}else {
printf("That's not an answer.\n");
}
}
我尝试过 strcmp、mallocs、plain conditions,但它不起作用,如果有人有答案,那就太好了。
附言
请尝试在您的答案中包含代码和/或使它们尽可能详细,Thaks。
答:
与格式说明符一起使用将只能读取单个单词。如果你想阅读由几个单词组成的整行(例如),那么我建议你改用 fgets
。但是,请注意有关混合和 .另外,请参阅有关如何从输入中删除换行符的问题。我建议您根本不用于用户输入,而是始终使用 .scanf
%s
"Linus Torvalds\n"
fgets
scanf
fgets
scanf
fgets
该条件没有意义,因为该条件将始终为真。如果要比较 的内容,则需要使用 strcmp
函数。if("Linus Torvalds\n")
name
"Linus Torvalds\n"
另外,线
if (strcmp("n", yesno)){
是错误的,因为该函数要求其两个参数都是指向一个字符串的指针,即指向以 null 字符结尾的字符序列。但是,不是指针。 也是错误的,因为这样的指针只会指向单个字符,而不是指向以 null 字符结尾的字符序列。strcmp
yesno
&yesno
如果两个字符串匹配,则该函数将返回零,如果不匹配,则返回非零。因此,您可能希望将 的返回值与零进行比较。strcmp
strcmp
我建议你像这样重写你的程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_line_from_user( const char prompt[], char buffer[], int buffer_size );
int main( void )
{
char input[200];
get_line_from_user(
"Hello adventurer, are you here to learn Linux? (y/n) ",
input, sizeof input
);
if ( strcmp( input, "y" ) == 0 )
{
get_line_from_user(
"Great! What is your name? ",
input, sizeof input
);
if ( strcmp( input, "Linus Torvalds" ) == 0 )
{
printf( "Achievement complete: In God We Trust\n" );
printf( "Nice to meet you! My name is Richard Stallman.\n" );
}
else
{
printf( "Nice to meet you! My name is Linus Torvalds.\n" );
}
}
else if ( strcmp( input, "n" ) == 0 )
{
printf( "Ok! Bye!" );
}
else
{
printf( "That's not an answer.\n" );
}
}
//This function will read exactly one line of input from the
//user. It will remove the newline character, if it exists. If
//the line is too long to fit in the buffer, then the function
//will automatically reprompt the user for input. On failure,
//the function will never return, but will print an error
//message and call "exit" instead.
void get_line_from_user( const char prompt[], char buffer[], int buffer_size )
{
for (;;) //infinite loop, equivalent to while(1)
{
char *p;
//prompt user for input
fputs( prompt, stdout );
//attempt to read one line of input
if ( fgets( buffer, buffer_size, stdin ) == NULL )
{
printf( "Error reading from input!\n" );
exit( EXIT_FAILURE );
}
//attempt to find newline character
p = strchr( buffer, '\n' );
//make sure that entire line was read in (i.e. that
//the buffer was not too small to store the entire line)
if ( p == NULL )
{
int c;
//a missing newline character is ok if the next
//character is a newline character or if we have
//reached end-of-file (for example if the input is
//being piped from a file or if the user enters
//end-of-file in the terminal itself)
if ( (c=getchar()) != '\n' && !feof(stdin) )
{
if ( c == EOF )
{
printf( "Error reading from input!\n" );
exit( EXIT_FAILURE );
}
printf( "Input was too long to fit in buffer!\n" );
//discard remainder of line
do
{
c = getchar();
if ( c == EOF )
{
//this error message will be printed if either
//a stream error or an unexpected end-of-file
//is encountered
printf( "Error reading from input!\n" );
exit( EXIT_FAILURE );
}
} while ( c != '\n' );
//reprompt user for input by restarting loop
continue;
}
}
else
{
//remove newline character by overwriting it with
//null character
*p = '\0';
}
//input was ok, so break out of loop
break;
}
}
此程序具有以下行为:
Hello adventurer, are you here to learn Linux? (y/n) y
Great! What is your name? Jimmy
Nice to meet you! My name is Linus Torvalds.
Hello adventurer, are you here to learn Linux? (y/n) y
Great! What is your name? Linus Torvalds
Achievement complete: In God We Trust
Nice to meet you! My name is Richard Stallman.
Hello adventurer, are you here to learn Linux? (y/n) n
Ok! Bye!
Hello adventurer, are you here to learn Linux? (y/n) sdfsdgf
That's not an answer.
评论
get_line_from_user
for (;;)
break
get_line_from_user
get_line_from_user
上一个:运动鞋价格比较模型
下一个:BigQuery 比较两个列表
评论
strcmp()
比较两个字符串(即以 null 结尾的字符数组)。 不是字符串。yesno
strcmp
"foo"
"Foo"
strcasecmp
stricmp
system("clear");
if("Linus Torvalds\n")
NULL
if (1)
yesno