首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C中实现单个字符的scanf

如何在C中实现单个字符的scanf
EN

Stack Overflow用户
提问于 2012-11-24 22:16:44
回答 10查看 556.8K关注 0票数 122

在C中:我试图用scanf从用户那里获取字符,当我运行它时,程序不会等待用户输入任何东西……

代码如下:

代码语言:javascript
复制
char ch;
printf("Enter one char");
scanf("%c", &ch);
printf("%c\n",ch);

为什么不起作用?

EN

回答 10

Stack Overflow用户

发布于 2012-11-25 00:31:03

%c转换说明符不会自动跳过任何前导空格,因此如果输入流中有零散的换行符(例如,来自前一个条目),scanf调用将立即使用它。

解决此问题的一种方法是在格式字符串中的转换说明符之前放置一个空格:

代码语言:javascript
复制
scanf(" %c", &c);

格式字符串中的空格告诉scanf跳过前导空格,将使用%c转换说明符读取第一个非空格字符。

票数 279
EN

Stack Overflow用户

发布于 2016-12-03 23:02:48

首先,避免使用scanf()。使用它是不值得痛苦的。

请参阅:Why does everyone say not to use scanf? What should I use instead?

scanf()中使用空格字符将忽略输入流中剩余的任意数量的空格字符,如果需要读取更多的输入怎么办?考虑一下:

代码语言:javascript
复制
#include <stdio.h>

int main(void)
{
   char ch1, ch2;

   scanf("%c", &ch1);  /* Leaves the newline in the input */
   scanf(" %c", &ch2); /* The leading whitespace ensures it's the
                          previous newline is ignored */
   printf("ch1: %c, ch2: %c\n", ch1, ch2);

   /* All good so far */

   char ch3;
   scanf("%c", &ch3); /* Doesn't read input due to the same problem */
   printf("ch3: %c\n", ch3);

   return 0;
}

虽然第三个scanf()可以使用前导空格以相同的方式修复,但它并不总是像上面那样简单。另一个主要问题是,如果输入流中的任何输入与格式不匹配,scanf()将不会丢弃任何输入。例如,如果您为int输入abc,例如:scanf("%d", &int_var);,那么abc将必须读取并丢弃。考虑一下:

代码语言:javascript
复制
#include <stdio.h>

int main(void)
{
    int i;

    while(1) {
        if (scanf("%d", &i) != 1) { /* Input "abc" */
            printf("Invalid input. Try again\n");
        } else {
            break;
        }
    }

    printf("Int read: %d\n", i);
    return 0;
}

另一个常见的问题是混合使用scanf()fgets()。考虑一下:

代码语言:javascript
复制
#include <stdio.h>

int main(void)
{
    int age;
    char name[256];
    printf("Input your age:");
    scanf("%d", &age); /* Input 10 */
    printf("Input your full name [firstname lastname]");
    fgets(name, sizeof name, stdin); /* Doesn't read! */
    return 0;
}

fgets()的调用不会等待输入,因为前一次scanf()调用留下的换行符是read的,fgets()在遇到换行符时会终止输入读取。

scanf()相关的还有许多其他类似的问题。这就是为什么通常建议避免它的原因。

那么,还有什么选择呢?请按以下方式使用fgets()函数来读取单个字符:

代码语言:javascript
复制
#include <stdio.h>

int main(void)
{
    char line[256];
    char ch;

    if (fgets(line, sizeof line, stdin) == NULL) {
        printf("Input error.\n");
        exit(1);
    }

    ch = line[0];
    printf("Character read: %c\n", ch);
    return 0;
}

使用fgets()时需要注意的一个细节是,如果inut缓冲区中有足够的空间,则会读入换行符。如果它不受欢迎,那么您可以将其删除:

代码语言:javascript
复制
char line[256];

if (fgets(line, sizeof line, stdin) == NULL) {
    printf("Input error.\n");
    exit(1);
}

line[strcpsn(line, "\n")] = 0; /* removes the trailing newline, if present */
票数 30
EN

Stack Overflow用户

发布于 2018-07-10 22:54:47

这对我很有效,试试看。

代码语言:javascript
复制
int main(){
char c;
scanf(" %c",&c);
printf("%c",c);
return 0;
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13542055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档