我如何只让用户在 c 中输入一个字符
How would I only let the user input one character in c
如果我只希望用户输入一个字符,我将如何用 c 语言实现这一点。我对此的尝试如下,但失败得很惨。根据我在网上阅读的内容,我听说您可以使用函数 gets 或 fgets 来完成此操作,但我不知道如何操作。
do
{
geussNumber += 1;
printf("Enter guess number %d\n", geussNumber);
scanf(" %c", &geussLetter);
scanf ("%c", &inputViolation);
if (isalpha(geussLetter) == 0)
{
printf("You did not enter a letter\n");
}
else if (inputViolation == true)
{
printf("You eneterd more than one letter\n");
}
else
{
inputLoopEnd = 1;
}
}
while( inputLoopEnd == false );
您可以使用 getc
函数族。
例如,看看 http://quiz.geeksforgeeks.org/difference-getchar-getch-getc-getche/。
您似乎想一次读取一行(即 用户键入一个字母猜测然后 ),并且您想验证猜测确实只包含一个字母。用这些术语来表达问题可能会使 fgets()
的应用方式变得更清楚,因为该函数的目的是一次读取一行。读完一整行——或者至少是缓冲区可以容纳的那么多——你可以验证它并提取猜测。
scanf()
很难正确使用,所以我推荐 fgets()
方法。但是,如果你坚持使用 scanf()
,那么你可以这样做:
// consumes leading whitespace, inputs one character, then consumes any
// immediately-following run of spaces and tabs:
int result = scanf(" %c%*[ \t]", &guessLetter);
if (result == EOF) {
// handle end-of-file ...
} else {
assert(result == 1); // optional; requires assert.h
int nextChar = getchar();
if ((nextChar == '\n') || (nextChar == EOF)) {
// handle multiple-character guess ...
} else if (!isalpha(guessLetter)) {
// handle non-alphabetic guess ...
} else {
// it's valid ...
}
}
请勿使用 fgets() 或 fputs() 等...它们已不再使用。
从描述中可以看出here...这个函数是为了处理str类型的对象而设计的,而你现在更专注于使用chars那么为什么不只处理chars到让生活更轻松。
你不能像你认为的那样做...
scanf(" %c", &geussLetter);
scanf ("%c", &inputViolation);
这是行不通的,因为即使用户按照他们应该的方式只输入一个字符,它仍然会触发您的 inputViolation 方案。
编辑:12:14pm 2016 年 7 月 20 日
我非常喜欢社区 wiki 上 MOHAMAD's solution 的优雅。
所以我根据你的情况进行了编辑,它在这里也很有效。同样的想法...
#include <stdio.h>
#include <stdlib.h>
int clean_stdin()
{
while (getchar() != '\n');
return 1;
}
int main(void)
{
int first_time_around = 0;
char theguess = 0;
char c;
do
{
if (first_time_around == 0)
first_time_around++;
else
printf("Wrong input \n");
printf("Enter guess number: \n");
} while (((scanf("%c%c", &theguess, &c) != 2 || c != '\n')
&& clean_stdin()) || !isalpha(theguess));
return 0;
}
如果我只希望用户输入一个字符,我将如何用 c 语言实现这一点。我对此的尝试如下,但失败得很惨。根据我在网上阅读的内容,我听说您可以使用函数 gets 或 fgets 来完成此操作,但我不知道如何操作。
do
{
geussNumber += 1;
printf("Enter guess number %d\n", geussNumber);
scanf(" %c", &geussLetter);
scanf ("%c", &inputViolation);
if (isalpha(geussLetter) == 0)
{
printf("You did not enter a letter\n");
}
else if (inputViolation == true)
{
printf("You eneterd more than one letter\n");
}
else
{
inputLoopEnd = 1;
}
}
while( inputLoopEnd == false );
您可以使用 getc
函数族。
例如,看看 http://quiz.geeksforgeeks.org/difference-getchar-getch-getc-getche/。
您似乎想一次读取一行(即 用户键入一个字母猜测然后 fgets()
的应用方式变得更清楚,因为该函数的目的是一次读取一行。读完一整行——或者至少是缓冲区可以容纳的那么多——你可以验证它并提取猜测。
scanf()
很难正确使用,所以我推荐 fgets()
方法。但是,如果你坚持使用 scanf()
,那么你可以这样做:
// consumes leading whitespace, inputs one character, then consumes any
// immediately-following run of spaces and tabs:
int result = scanf(" %c%*[ \t]", &guessLetter);
if (result == EOF) {
// handle end-of-file ...
} else {
assert(result == 1); // optional; requires assert.h
int nextChar = getchar();
if ((nextChar == '\n') || (nextChar == EOF)) {
// handle multiple-character guess ...
} else if (!isalpha(guessLetter)) {
// handle non-alphabetic guess ...
} else {
// it's valid ...
}
}
请勿使用 fgets() 或 fputs() 等...它们已不再使用。
从描述中可以看出here...这个函数是为了处理str类型的对象而设计的,而你现在更专注于使用chars那么为什么不只处理chars到让生活更轻松。
你不能像你认为的那样做...
scanf(" %c", &geussLetter);
scanf ("%c", &inputViolation);
这是行不通的,因为即使用户按照他们应该的方式只输入一个字符,它仍然会触发您的 inputViolation 方案。
编辑:12:14pm 2016 年 7 月 20 日
我非常喜欢社区 wiki 上 MOHAMAD's solution 的优雅。
所以我根据你的情况进行了编辑,它在这里也很有效。同样的想法...
#include <stdio.h>
#include <stdlib.h>
int clean_stdin()
{
while (getchar() != '\n');
return 1;
}
int main(void)
{
int first_time_around = 0;
char theguess = 0;
char c;
do
{
if (first_time_around == 0)
first_time_around++;
else
printf("Wrong input \n");
printf("Enter guess number: \n");
} while (((scanf("%c%c", &theguess, &c) != 2 || c != '\n')
&& clean_stdin()) || !isalpha(theguess));
return 0;
}