C语言输入不同字符 屏幕显示不同,c语言中易混淆的东西 1 getch() getche()和getchar()之间区别 scanf sscanf (fscanf fgets fgetc )...

getch() getche()和getchar()之间区别

发布人 : IT专家

发布时间 : 2009-10-21 07:52:23.0

首先不要忘了,要用getch()必须引入头文件conio.h,以前学C语言的时候,我们总喜欢用在程序的末尾加上它,利用它来实现程序运行完了暂停不退出的效果。如果不加这句话,在TC2.0的环境中我们用Ctrl F9编译并运行后,程序一运行完了就退回到TC环境中,我们根本来不及看到结果,这时要看结果,我们就要按Alt F5回到DOS环境中去看结果,这很麻烦。而如果在程序的结尾加上一行getch();语句,我们就可以省掉会DOS看结果这个步骤,因为程序运行完了并不退出,而是在程序最后把屏幕停住了,按任意键才退回到TC环境中去。那我们来看看getch()到底起的什么作用,getch()实际是一个输入命令,就像我们用cin>>的时候程序会停下来等你输入,和cin不同的是,getch()的作用是从键盘接收一个字符,而且并不把这个字符显示出来,就是说,你按了一个键后它并不在屏幕上显示你按的什么,而继续运行后面的代码,所以我们在C 中可以用它来实现“按任意键继续”的效果,即程序中遇到getch();这行语句,它就会把程序暂停下来,等你按任意键,它接收了这个字符键后再继续执行后面的代码。

你也许会问,为什么我们在C 中就没有在程序的末尾加上getch(),解释是,软件总是不断更新的,不好的地方当然要进行改正,getch()加在程序末尾,它又不赋值给任何变量,所以它在这个地方完全是垃圾代码,与程序无关。C 中考虑到这一点,于是在每次程序运行完了并不退出,而是自动把屏幕停下来,并显示“press any key...”叫你按任意键退出,这就好比C 在它的环境中运行程序,在程序的末尾自动加上了一行getch();语句,并且在这行语句前还添加了一行输出语句cout<

还有一个语句,和getch()很相似,getche(),它也需要引入头文件conio.h,那它们之间的区别又在哪里呢?不同之处就在于getch()无返回显示,getche()有返回显示。怎么说呢?我举个例子你就明白了。

--------------------------------------

#include

#include

void main()

{

char ch;

for(int i=0;i<5;i )

{

ch=getch();

printf("%c",ch);

}

}

--------------------------------------

这里输入输出我用的是C的函数库,没有用C 的iostream.h,这个我等会再说。首先这是个连续5次的循环来实现5次停顿,等待我们输入,我们编译并运行这个程序,假设我们分别输入abcde,屏幕上显示的结果是abcde,这个abcde并不是在ch=getch();中输出的,我们把printf("%c",ch);这行语句去掉,就会发现我们按5次任意键程序就结束了,但屏幕上什么都没有显示。

然后我们在把代码中的getch()换成getche()看看有什么不同,我们还是分别输入abcde,这时屏幕上显示的结果是aabbccddee,我们把printf("%c",ch);这行语句再去掉看看,显示的结果就是abcde了,说明程序在执行ch=getche();这条语句的时候就把我们输入的键返回显示在屏幕上,有无回显就是它们的唯一区别。

好了,我们再来说说为什么不用C 函数库的原因。你可以试试把这个程序改成C 的形式:

--------------------------------------

#include

#include

void main()

{

char ch;

for(int i=0;i<5;i )

{

ch=getch();

cout<

}

}

--------------------------------------

你会发现运行结果是完全不同的,说实话我也搞不清它是怎么编译运行的,以前我在C 中用它来实现任意键继续的功能就发现了这个问题。如果在getch();后面有个cout<

有人会说,既然是C的函数库中的,那么就应该淘汰了,我们还研究它,还用它干嘛?但是我发现还是有用着它的地方,否则我也不会在这里说这么多来耽误大家的时间。我就举个例子吧,程序如下:

--------------------------------------

#include

#include

void main()

{

char ch='*';

while(ch=='*')

{

printf("\n按 * 继续循环,按其他键退出!");

ch=getch();

}

printf("\n退出程序!");

}

--------------------------------------

我们可以在这个循环体中添加我们想要的功能,程序中按*继续循环,其他任意键退出,而且利用getch()无回显的特性,我们不管按什么,都不会在屏幕上留下痕迹,使我们的界面达到美观效果,如果还有更好的办法实现这个功能,我可能就不会在这里提这么多了。如果你真的有更好的办法,请一定告诉我,谢谢!

下面我把别人网页上的几个例子转载如下:

--------------------------------------

//例一:这个例子是为了说明getch()和getche()的区别

#include

#include

//这里讲个小故事:因为这个代码是在别人网页上的,别人用的C环境,可能是不需要conio.h头文件

//就可以用getch();(我就不清楚了),也可能是忘了写,网页上的源代码没有#include这一行,

//我让老婆去看这个网页,老婆把网页上的代码复制到C 环境中,不能编译就跟我哭,

//呵呵,我可爱的傻老婆!

void main()

{

char c, ch;

c=getch(); /*从键盘上读入一个字符不回显送给字符变量c*/

putchar(c); /*输出该字符*/

ch=getche(); /*从键盘上带回显的读入一个字符送给字符变量ch*/

putchar(ch);

printf("\n\n");

}

--------------------------------------

//例二:这个例子是演示交互输入的过程中完成暂停功能

#include

#include

void main()

{

char c, s[20];

printf("Name:");

gets(s);

printf("Press any key to continue...\n\n");

getch(); /*等待输入任一键*/

printf("\n\n");

}

--------------------------------------

//例三:getchar()函数也是从键盘上读入一个字符,并带回显。它与前面两个函数的区别在于:

//   getchar()函数等待输入直到按回车才结束,回车前的所有输入字符都会逐个显示在屏幕上。

//   但只有第一个字符作为函数的返回值。#include

#include

void main()

{

char c;

c=getchar(); /*从键盘读入字符直到回车结束*/

//getchar()在这里它只返回你输入字符串的第一个字符,并把返回值赋值给c

putchar(c); /*显示输入的第一个字符*/

printf("\n\n");

}

--------------------------------------

//例四:呵呵,这个程序你运行一下,相信你又会有疑问了

#include

#include

void main()

{

char c;

while ((c=getchar())!='\n') /*每个getchar()依次读入一个字符*/

printf("%c",c); /*按照原样输出*/

printf("\n\n");

}

-------------------------------------

例四的程序运行时,首先停下来,等你输入一串字符串,输入完毕后,它把你输入的整个字符串都输出来了,咦,你不是说getchar()只返回第一个字符么,这里怎么?

不要急,我慢慢跟你解释,忍耐一下,马上就讲完了。因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了,它还在我们的内存中,就好比,开闸放水,我们把水放到闸里去以后,开一次闸就放掉一点,开一次就放掉一点,直到放光了为止,我们输入的字符串也是这么一回事,首先我们输入的字符串是放在内存的缓冲区中的,我们调用一次getchar()就把缓冲区中里出口最近的一个字符输出,也就是最前面的一个字符输出,输出后,就把它释放掉了,但后面还有字符串,所以我们就用循环把最前面的一个字符一个个的在内存中释放掉,直到不满足循环条件退出为止。例子中循环条件里的'\n'实际上就是你输入字符串后的回车符,所以意思就是说,直到遇到回车符才结束循环,而getchar()函数就是等待输入直到按回车才结束,所以实现了整个字符串的输出。当然,我们也可以把循环条件改一下,比如while ((c=getchar())!='a'),什么意思呢,意思就是遇到字符'a'就停止循环

gets和scanf函数的区别

默认分类 2010-01-05 19:29:32 阅读102 评论1 字号:大中小

scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别。若想从键盘上输入字符串"hi hello",则应该使用__gets__函数。

gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。

char string[15]; gets(string); /*遇到回车认为输入结束*/

scanf("%s",string); /*遇到空格认为输入结束*/

所以在输入的字符串中包含空格时,应该使用gets输入。

scanf和gets获取字符串时的区别

在C语言中,能构获取字符串的函数至少有两个:

1.scanf()

所在头文件:stdio.h

语法:scanf("格式控制字符串",变量地址列表);

接受字符串时:scanf("%s",字符数组名或指针);

2.gets()

所在头文件:stdio.h

语法:gets(字符数组名或指针);

两者在接受字符串时:

1.不同点:

scanf不能接受空格、制表符Tab、回车等;

而gets能够接受空格、制表符Tab和回车等;

2.相同点:

字符串接受结束后自动加'\0'。

例1:

#include

main()

{

char ch1[10],ch2[10];

scanf("%s",ch1);

gets(ch2);

}

依次键入asd空格fg回车,asd空格fg回车,则ch1="asd\0",ch2="asd fg\0"。

例2:

#include

main()

{

char ch1[10],ch2[10],c1,c2;

scanf("%s",ch1);

c1=getchar();

gets(ch2);

c2=getchar();

}

依次键入asdfg回车,asdfg回车,则ch1="asdfg\0",c1='\n',ch2="asdfg\0",c2需输入。

scanf :当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是回车,空格和tab键仍会留在输入的缓冲区中。

gets:可接受回车键之前输入的所有字符,并用'\n'替代 '\0'.回车键不会留在输入缓冲区中

gets()用到读取字符串,用回车结束输入

scanf()可以读取所有类型的变量

Syntax:

#include int fscanf( FILE *stream, const char *format, ... );

The function fscanf() reads data from the given file stream in a manner exactly like scanf(). The return value of fscanf() is the number of variables that are actually assigned values, or EOF if no assignments could be made.

Related topics:

Syntax:

#include int sscanf( const char *buffer, const char *format, ... );

The function sscanf() is just like scanf(), except that the inputis read from buffer.

Syntax:

#include int scanf( const char *format, ... );

The scanf() function reads input from STDIN, according to the given format, and stores the data in the other arguments. It works a lot like printf(). The format string consists of control characters, whitespace characters, and non-whitespace characters. The control characters are preceded by a % sign, and are as follows:

Control Character

Explanation

%c

a single character

%d

a decimal integer

%i

an integer

%e, %f, %g

a floating-point number

%o

an octal number

%s

a string

%x

a hexadecimal number

%p

a pointer

%n

an integer equal to the number of characters read so far

%u

an unsigned integer

%[]

a set of characters

%% a percent sign

scanf() reads the input, matching the characters from format. When a control character is read, it puts the value in the next variable. Whitespace (tabs, spaces, etc) are skipped. Non-whitespace characters are matched to the input, then discarded. If a number comes between the % sign and the control character, then only that many characters will be converted into the variable. If scanf() encounters a set of characters, denoted by the %[] control character, then any characters found within the brackets are read into the variable. The return value of scanf() is the number of variables that were successfully assigned values, or EOF if there is an error

名称:

sscanf() - 从一个字符串中读进与指定格式相符的数据.

函数原型:

Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

int scanf( const char *format [,argument]... );

说明:

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}

注:

1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)

2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。

3、width表示读取宽度。

4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。

5、type :这就很多了,就是%s,%d之类。

6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值

支持集合操作:

%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

%[aB'] 匹配a、B、'中一员,贪婪性

%[^a] 匹配非a的任意字符,贪婪性

例子:

1. 常见用法。

char buf[512] ={0} ;

sscanf("123456 ", "%s", buf);

printf("%s\n", buf);

结果为:123456

2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

sscanf("123456 ", "%4s", buf);

printf("%s\n", buf);

结果为:1234

3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

sscanf("123456 abcdedf", "%[^ ]", buf);

printf("%s\n", buf);

结果为:123456

4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);

printf("%s\n", buf);

结果为:123456abcdedf

5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);

printf("%s\n", buf);

结果为:123456abcdedf

6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中

sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);

printf("%s\n", buf);

结果为:12DDWDFF

7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)

sscanf(“hello, world”, "%*s%s", buf);

printf("%s\n", buf);

结果为:world

%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

如果没有空格则结果为NULL。

sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.  //-------------------------------------------------------

sscanf,表示从字符串中格式化输入

上面表示从str中,输入数字给x,就是32700

久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。

sscanf是一个运行时函数,原形很简单:

int sscanf(

const char *buffer,

const char *format [,

argument ] ...

);  它强大的功能体现在对format的支持上。

我以前用它来分隔类似这样的字符串2006:03:18:

int a, b, c;

sscanf("2006:03:18", "%d:%d:%d", a, b, c);

以及2006:03:18 - 2006:04:18:

char sztime1[16] = "", sztime2[16] = "";

sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

但是后来,我需要处理2006:03:18-2006:04:18

仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。

我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。

format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。

%[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。

所以那个问题也就迎刃而解了:

sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

fscanf函数

7c1382c5495006401c3d0aaf75db9e25.gif

2008-03-14 22:16

下面介绍一个例子, 运行后产后一个test.dat的文件。

例11:

#include

main()

{

char *s="That's good news");  /*定义字符串指针并初始化*/

int i=617;                    /*定义整型变量并初始化*/

FILE *fp;                     /*定义文件指针*/

fp=fopne("test.dat", "w");    /*建立一个文字文件只写*/

fputs("Your score of TOEFLis", fp);/*向所建文件写入一串字符*/

fputc(':', fp);               /*向所建文件写冒号:*/

fprintf(fp, "%d\n", i);       /*向所建文件写一整型数*/

fprintf(fp, "%s", s);         /*向所建文件写一字符串*/

fclose(fp);                   /*关闭文件*/

}

用DOS的TYPE命令显示TEST.DAT的内容如下所示:

屏幕显示

Your score of TOEFL is: 617

That's good news

2. 文件的顺序读操作函数

fscanf()、fgets()和fgetc()函数

函数fscanf()、fgets()和fgetc()均为文件的顺序读操作函数, 其调用格式

如下:

int fscanf(FILE *stream, char *format, );

char fgets(char *string, int n, FILE *steam);

int fgetc(FILE *steam);

fscanf()函数的用法与scanf()函数相似,   只是它是从文件中读到信息。

fscanf()函数的返回值为EOF(即-1), 表明读错误, 否则读数据成功。fgets()函

数从文件中读取至多n-1个字符(n用来指定字符数), 并把它们放入string指向的

字符串中, 在读入之后自动向字符串未尾加一个空字符, 读成功返回string指针,

失败返回一个空指针。fgetc()函数返回文件当前位置的一个字符,  读错误时返

回EOF。

下面程序读取例11产生的test.dat文件, 并将读出的结果显示在屏幕上。

例12

#include

main()

{

char *s, m[20];

int i;

FILE  *fp;

fp=fopen("test.dat", "r");    /*打开文字文件只读*/

fgets(s, 24, fp);             /*从文件中读取23个字符*/

printf("%s", s);              /*输出所读的字符串*/

fscanf(fp, "%d", &i);         /*读取整型数*/

printf("%d", i);              /*输出所读整型数*/

putchar(fgetc(fp));           /*读取一个字符同时输出*/

fgets(m, 17, fp);             /*读取16个字符*/

puts(m);                      /*输出所读字符串*/

fclose(fp);                   /*关闭文件*/

getch();                      /*等待任一键*/

}

运行后屏幕显示:

Your score of TOEFL is: 617

That's good news

如果将上例中fscanf(fp, "%d", &i)改为fscanf(fp, "%s", m),  再将其后

的输出语句改为printf("%s", m), 则可得出同样的结果。由此可见Turbo C2. 0

中只要是读文字文件, 则不论是字符还是数字都将按其ASCII值处理。 另外还要

说明的一点就是fscanf()函数读到空白符时, 便自动结束, 在使用时要特别注意

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值