如果我只想让用户输入一个字符,我将如何用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 );
答案 0 :(得分:3)
您可以使用getc
系列函数。
例如,请查看http://quiz.geeksforgeeks.org/difference-getchar-getch-getc-getche/。
答案 1 :(得分:0)
似乎你想一次读取一行输入(即用户键入一个字母的猜测然后<输入>),你想验证猜测确实包含只有一个字母。用这些术语来解决问题或许可以更清楚地应用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 ...
}
}
答案 2 :(得分:-1)
不要使用fgets()或fputs()之类的东西......它们不再使用了。
从描述中可以看到here ...这个函数用于处理str类型的对象,你现在更专注于使用字符,所以为什么不只处理字符来生活更容易。
你不能以你认为的方式做到这一点......
scanf(" %c", &geussLetter);
scanf ("%c", &inputViolation);
这不起作用,因为即使用户只按照预期的方式输入一个字符,它仍然会触发你的inputViolation方案。
编辑:2016年7月20日下午12:14
我非常喜欢社区维基上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;
}