为了账号安全,请及时绑定邮箱和手机立即绑定

如何在C中对单个字符进行扫描

如何在C中对单个字符进行扫描

C
富国沪深 2019-06-28 17:13:17
如何在C中对单个字符进行扫描在C中:我试图从用户那里获得charscanf当我运行该程序时,不要等待用户输入任何内容.这是代码:char ch;printf("Enter one char");scanf("%c", &ch);printf("%c\n",ch);为什么不起作用?
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

这个%c转换说明符不会自动跳过任何前导空格,因此如果输入流中有一个偏离的换行符(例如,来自上一项)scanf呼叫会立即消耗掉它。

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

scanf(" %c", &c);

格式字符串中的空白显示scanf若要跳过前导空格,则第一个非空白字符将使用%c转换说明符


查看完整回答
反对 回复 2019-06-28
?
侃侃无极

TA贡献2051条经验 获得超10个赞

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

见:为什么大家都说不要用扫描呢?我应该用什么代替?

中使用空白字符。scanf()如果需要读取更多的输入,会忽略输入流中留下的任意数量的空格字符吗?考虑:

#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()如果输入流与格式不匹配,则不会丢弃输入流中的任何输入。例如,如果您输入abc为了int例如:scanf("%d", &int_var);然后abc将不得不阅读和丢弃。考虑:

#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()..考虑:

#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,而fget()在遇到换行符时终止输入读取。

还有许多其他类似的问题scanf()..这就是为什么人们通常建议避免这样做。

那么,还有别的选择吗?使用fgets()函数以下列方式读取单个字符:

#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缓冲区中有足够的空间,将在换行符中读取。如果它不可取,那么您可以删除它:

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 */


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 666 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信