关于C语言中的输入问题

逍遥书生 发布于 2012/11/23 11:40
阅读 1K+
收藏 1

我在C中使用输入函数时遇到点麻烦。

我希望从键盘获得一个输入字符,包括换行符在内,仅仅需要一个。
但是用户不一定按照我的期望进行输入,他可能输入一个字符串,那我就截取他输入的第一个字符,忽略掉其他的字符,同时把输入缓存清空,等待下一次输入。现在的问题是,我不知道怎么才能实现。

#include <stdio.h>

main()
{
    char ch;
    
    printf("Please input: ");
    scanf("%c",&ch);
    printf("%d\n",ch);
   
}
如果仅仅是这样,那可以读取第一个字符,换行符也能读取,但是输入缓存可能还有其他的多余字符。那我用函数清空缓存:
void InitInput()                 /* 清空输入缓存 */
{
	char ch; 
	do {
	    p = getchar();
	} while (ch != '\n');
} 

但是这就导致一个问题,必须按下回车,程序才能继续运行,这又不是我期望的。那么我该怎么设置呢?

我的需求就是,如果用户什么都不输入直接换行,需要把这个换行符读取出来。如果用户输入一大串乱七八糟的东西然后换行,我只要他输入的第一个字符,其余丢弃,同时准备好等待下一次输入。这个让我郁闷了很久,还是没有实现。

另外一个需求就是,我希望能从键盘获取数字。如果直接回车,是允许的,如果是一串无符号数字,是允许的,如果夹杂字符的输入时不被允许的。这个能简单的实现吗?

加载中
0
王小泉
设置定时器?比如在输入第一个字符之后开启一个线程,不停地检查ch的值
0
逍遥书生
逍遥书生

引用来自“王小泉”的答案

设置定时器?比如在输入第一个字符之后开启一个线程,不停地检查ch的值
我没有明白你说的意思。
0
逍遥书生
逍遥书生
代码有错误,怎么修改呀?
逍遥书生
逍遥书生
回复 @红薯 : 谢谢。代码没有编译验证,直接复制粘贴修改了一下,结果出错了。
红薯
红薯
在回帖里补充吧,因为有人评论了就没法修改原帖
0
jingweiyoung
jingweiyoung
如果只需要读取一个字符,不用回车直接接收输入字符。相当于Windows下VC的getch()函数,Linux环境下需要设置输入终端模式,具体实现可以查看man手册中关于TERMIOS的相关接口,比如tcgetattr, tcsetattr ...
0
逍遥书生
逍遥书生

第二段代码里面函数getchar的赋值对象是变量ch。
其本意就是跳过输入行的剩余部分,这个是我在学习《C语言程序设计:现代方法》里面看到的一个惯用法。其精简模式如下:

while(getchar() != '\n')
    ;
0
逍遥书生
逍遥书生

引用来自“yangjingwei”的答案

如果只需要读取一个字符,不用回车直接接收输入字符。相当于Windows下VC的getch()函数,Linux环境下需要设置输入终端模式,具体实现可以查看man手册中关于TERMIOS的相关接口,比如tcgetattr, tcsetattr ...

我真的没想搞得太复杂,我的编程环境可以说就是基本的Turbo C,不考虑操作系统的差异。我只是想用基本的库函数解决一下,VC我还真没有用过。

当然非常感谢你的指点。

0
逍遥书生
逍遥书生

我考虑过用字符串接收输入的内容,但是会出现无法获取换行符的问题。如果出现接收字符串溢出的话,程序出错。代码如下:

#include <stdio.h>
#include <string.h>

void InitInput()                 /* 清空输入缓存 */
{
	while (getchar() != '\n');
}

main()
{
	char ch[10];
	
	printf("Please input: ");
	scanf("%s",ch);
	printf("%d\n",ch[0]);       //为了显示换行符,故意使用%d 
//	InitInput();
	printf("Please input: ");
	scanf("%s",ch);
	printf("%d\n",ch[0]);
	
}
0
Yisen
Yisen
用fgets
0
Jooooooker
Jooooooker
        char c;
        printf("Please input: ");
        c = getchar();
        printf("%d\n", c); 
        InitInput();
        printf("Please input: ");
        c = getchar();
        printf("%d\n", c); 

0
逍遥书生
逍遥书生

我貌似解决问题了,仅仅转换了一下思路结果用了一个判断就完美实现了。
我的需求如下,如果用户什么都不输入直接换行,需要把这个换行符读取出来。如果用户输入一大串乱七八糟的东西然后换行,我只要他输入的第一个字符,其余丢弃,同时准备好等待下一次输入。代码如下:

#include <stdio.h>
#include <string.h>

char Input()
{
    char ch;
    
    printf("Please input: \n");
    ch = getchar();
    if(ch != '\n')
    {
        while (getchar() != '\n');
    }
    
    return ch;
}

main()
{
    char p;
    p = Input();
    printf("Your input is %d!\n", p);
    p = Input();
    printf("Your input is %d!\n", p);
} 
我郁闷了那么久的问题,结果一个判断就解决了,我浪费的时间呀!!!
返回顶部
顶部