gpt4 book ai didi

c - 字符输入在C中被完全忽略

转载 作者:行者123 更新时间:2023-11-30 19:01:47 24 4
gpt4 key购买 nike

我正在构建一个高尔夫计分板程序,我需要用户输入一个字符来询问他们是否正在参加比赛。但是,在获取单个字符输入时,它会被完全忽略,程序会退出。这是把我的头发扯掉的东西。

我尝试使用fgetc,getchar和scanf等不同类型的输入,但是所有这些都没有用。

void init(){
char tournamentOrNot;
char letter;
char name[40];
char golfClub[40];
char tournament[60];
printf("\nWhat is your name? ");
fgets(name, 100, stdin); //Input works
getchar();
printf("%s", name);
printf("Where are you playing golf at? NO SPACES\n");
fgets(name, 100, stdin); //Input works
getchar();
printf("Are you competing in a tournament?(Y/N)");
tournamentOrNot = getchar(); //Input ignored and program exits
if (tournamentOrNot == 'Y' || tournamentOrNot == 'y'){
printf("\nEnter the name for the tournament NO SPACES: ");
scanf("%s", &tournament);
printf("Initializing score board...");
printf("\n");
drawScoreBoard(name, golfClub, tournament);
}
else if (tournamentOrNot == 'N' || tournamentOrNot == 'n'){
tournament[7] = "Practice";
printf("Initializing score board...");
printf("\n");
drawScoreBoard(name, golfClub, tournament);
}
}


当前结果:

What is your name? <input>
Where are you playing golf at?
<input>
Are you playing in a tournament or not? (Y/N)
<input ignored>

Program exited with code 0 Press any key to continue...

最佳答案

如您所见,有很多方法可以读取C语言中的输入,并且跟踪它们的工作方式可能会造成混淆。尤其是,如果您在同一程序中混合使用不同的读取输入方式,则会发生一些疯狂的交互。

在大多数情况下,如果使用fgets读取所有内容,则将获得最佳结果。如您所知,fgets读取文本行。如果您想要其他东西(一个数字,一个字符或任何其他东西),要做的就是进一步处理该行文本(fgets为您阅读),以提取您的信息想。

如此说来,这是您的init函数重写为仅使用fgets的情况:

void init(){
char tournamentOrNot[10];
char name[40];
char golfClub[40];
char tournament[60];
printf("\nWhat is your name? "); fflush(stdout);
fgets(name, 40, stdin);
printf("Where are you playing golf at? "); fflush(stdout);
fgets(golfClub, 40, stdin);
printf("Are you competing in a tournament?(Y/N)"); fflush(stdout);
fgets(tournamentOrNot, 10, stdin);
if (tournamentOrNot[0] == 'Y' || tournamentOrNot[0] == 'y'){
printf("Enter the name for the tournament: "); fflush(stdout);
fgets(tournament, 60, stdin);
printf("Initializing score board...\n");
drawScoreBoard(name, golfClub, tournament);
}
else if (tournamentOrNot[0] == 'N' || tournamentOrNot[0] == 'n'){
strcpy(tournament, "Practice");
printf("Initializing score board...\n");
drawScoreBoard(name, golfClub, tournament);
}
}


我所做的最大更改是将 tournamentOrNot重新声明为10个字符的数组,而不是单个 char。因此,我们实际上是在单行回答“您是否正在参加比赛?”这一问题。在这种情况下,提取我们感兴趣的信息(一个字符的响应)很容易:数组的第一个字符为 tournamentOrNot[0]

一开始这似乎很奇怪:为什么将 tournamentOrNot视为字符串?您想要一个是/否答案,因此显然您将 tournamentOrNot声明为 char,并尝试使用 getchar进行读取。但是,正如我所说,将事物混合起来很棘手,并且 fgetsgetchar的混合(更进一步地说, scanf)很难正确处理。因此,如果我们想使用 fscanf读取所有输入,则即使我们希望用户键入“ Y”或“ N”之类的单字符字符串,我们也需要 tournamentOrNot作为字符串。 (但是这样,如果用户不遵守说明,并输入“是”或“否”,它也将起作用。)

我还进行了其他一些更改:


我在提示后添加了 fflush(stdout),以确保它们出来。 (除非您刷新输出,否则有时不会立即显示不以 \n结尾的提示。)
我摆脱了“没有空间”的措辞,因为一旦我们修复了输入,在其中带有空格的输入就不会出现问题。
我也使用 fgets来读取锦标赛名称,因为如果将 scanf放入混音中,则混合输入样式的问题会更加严重。
我将 tournament[7] = "Practice"更改为 strcpy(tournament, "Practice")
我将 fgets(name, 100, stdin)的一个实例更改为 fgets(name, 40, stdin)。 (正如@chux在评论中指出的那样,最终您将需要学习一种更可靠的跟踪这些大小的方法,因此您不必费力地手动将它们匹配。)
我将 fgets(name, 100, stdin)的另一个实例更改为 fgets(golfClub, 40, stdin);在其他地方您可能会忽略“高尔夫俱乐部的问题已被忽略”的评论。


现在,尽管我只是建议使用 fgets读取所有输入,但是您将发现它的一个缺点。它将终止的 \n字符留在读取的文本行中。通常,您想摆脱它。剥离它的一种方法(虽然有点麻烦)是说

char *p;
fgets(name, 100, stdin);
if((p = strrchr(name, '\n')) != NULL) *p = '\0';


还有许多其他方式,在紧凑性,便利性和正确性之间进行了各种折衷。



最后,如果您感到好奇,这里还有一些关于“如果在同一程序中混合使用不同的读取输入方式可能发生的疯狂交互”的更多解释。问题基本上与以下有关:换行符( \n)和其他空格。一些输入方法读取换行符并将其返回给您,一些输入方法读取换行符但不将其返回给您,一些输入方法将换行符留在输入流中(这意味着稍后的输入调用将找到它)。有些输入法会跳过其他空格,有些则不会。 (在 scanf的情况下,其某些输入指令会跳过空格,而其他输入指令则不会。)

如果确实愿意,您可以学习并跟踪所有这些看似无关紧要的差异,并编写一个使用 fgetsgetcharscanf混合的程序,但实际上可以工作。但是,就我个人而言,我发现这远远超过了其应有的麻烦,因此我更喜欢在任何地方使用 fgets(或其他一些行读取函数),或者在任何地方使用 getchar。 (而且我从不使用 scanf。)

关于c - 字符输入在C中被完全忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57240832/

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