我如何只让用户在 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;
}