天天看点

C 语言控制台输入数据台输入 从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

前几天很多人说期末考试C语言快要挂了,大佬救救我。

其实感觉自己也快要挂了,自己也是渣渣。

其实很多C语言的小细节自己都还没有搞清楚,在这里简单写一写吧。

(迷之微笑)

数据台输入

讲三个输入吧 scanf & getchar  还有一个字符串输入gets

1.scanf()函数

1.1输入缓存区

#include<stdio.h>

    int main()

    {

             char ch1, ch2;

             scanf("%c", &ch1);

             scanf("%c", &ch2);

             printf("%d  %d\n", ch1, ch2);

             return 0;

     }
           

这么一个简单的小函数

对吧?

我们输入两个字母a b,来获取他们相应的ASCII码

一般会这么输入:

press 'a'

press 'Enter'

press 'b'

press 'Enter'

然而。。。。。

我们会发现输入的结果是

65 10

这好像与我们开始想的一点都不一样呢

WTF???

原因就在于有个叫做输入缓存区(buffer)的东西

当你输入了一串数据流之后按了‘Enter’之后

你输入的东西就会都保存在那个缓存区

然后你的scanf再去缓存区一个个读

SO

你的缓存区是这样的:

a   enter   b   enter

你的scanf("%c", &ch1); 接收了a

然后你的scanf("%c", &ch2);就读了一个。。。回车

所以这也是你为什么输出10这个神秘数字的原因

Enter在ASCII中的值就是10

23333333

编译器就是这么操蛋

回车会随数据流进入缓存区

而scanf & getchar都是可以读取回车的

所以这个地方可以改成

scanf("%c %c", &ch1,&ch2);用空格隔断两个数据

也可以在第一个scanf后面加个getchar()让它吃掉回车

而且就算是只有一个scanf的时候 也同样要注意要吃掉缓存区的回车键

否则嘿嘿嘿

当然在写的过程查资料还有更diao的方法

1.fflush(stdin);

这个函数在#include<stdio.h>中有定义

作用是。。。。清空缓存区!!!!

2.scanf(" %c")在百分号C前面加个空格

这时候没有空格Enter就输不进来了

3.scanf("%[^\n]",string);

这个我真他妈的看不懂

查查资料吧

1.2 返回值问题

scanf()的返回值是输入时匹配成功的项目数的数目。

#include<stdio.h>

int main()
{
int a,b,c;
printf("%d"\n,scanf("%3d-%2d-%4d",&a,&b,&c));
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
           

当你输入;

12-345-6789

的时候

这时候的输出结果是

2

a=12,b=34,c=62

你的缓存区

12-345-6789Enter

在scanf

读取第一个%3d的时候

读到缓存区第三个是时候 发现是这个东西'-'

所以提前截止 将12传给了a

然后第二个%2d的时候

读两个3 4给了b

然后后面输入必须是-才对 而现在是5

所以scanf停止

这时候只有两个变量被成功赋值

所以返回了2

ps: c是因为什么都没读到,而它又是在函数体中创建的,所以它的默认值是个随机值。

1.3 scanf到底接受什么

还是根据输入格式码确定的

%d  吃的是十进制整数 而且可以进行加减运算。

%c  吃的是字符 也包括空格和回车

%u  unsiged类型

%s  读取字符串 但是遇到空格 EOF 或者到了限制长度 结束

%n  不读取字符 而是把处理的字符总数输入到指定变量中

%p  读取变量所在地址

%[]  读取[]中所存在的东西

%% 读取%???(这个实在是费解 我再查查资料)

%e,g,a        和f一样

2.getchar()函数

其实getchar和scanf一样也是要注意缓存区的问题。

2.1 getchar函数进行字符串的输入

getchar也是可以吃空格和回车的,所以在进行字符串输入时要注意这个问题。

#include <stdio.h>

int main()
{
	int str[20],i=1;
	while((str[i]=getchar())!='\n')
		i++;
        str[i]='\0';
         return 0;
}
           

一般就是这样输入一组字符串了

2.2返回值问题

getchar函数的返回值

如果接收正确的话  返回输入第一个值的ASCII码

如果错误的话          返回值是-1 (EOF)

2.3getchar与EOF的用法

因为之前看到很多人都用getchar()!=EOF的用法

所以在这里就说一下

我们将上面的经典输入模式改一下

#include <stdio.h>

int main()
{
	int a;
	while((a = getchar()) != EOF)
		putchar(a);
	return 0;
}
           

这个同样能够实现上述函数的功能

只是这个while循环不能够自己终止

除非你输入一个错误值让getchar返回EOF或者

在windous系统输入

ctrl+Z

在Unix/Linux系统用

ctrl+D

暂且就想到了这几个问题吧,其他的以后再加。

3.gets()函数

gets函数是个字符串处理函数

作用:

从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

其实我自己从来不用gets的

然后我看国外的博客也是推荐少用

好像是容易越界

贴出来吧

f you have code like this:

char s[10];
gets( s );
           

and you type in more than 10 characters when the program is run, you will overflow the buffer, causing undefined behaviour. The gets() function has no means of preventing you typing the characters and so should be avoided. Instead you should use fgets(), which allows you to limit the number of characters read, so that the buffer does not overflow.

写到现在已经快12点了

妈的我觉得边写边找资料已经四五个小时了

本来想学高数的

在下渣渣

错误还望指出

然后祝我期末全科不挂

C 语言控制台输入数据台输入 从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

呵呵

继续阅读