前几天很多人说期末考试C语言快要挂了,大佬救救我。
其实感觉自己也快要挂了,自己也是渣渣。
其实很多C语言的小细节自己都还没有搞清楚,在这里简单写一写吧。
(迷之微笑)
讲三个输入吧 scanf & getchar 还有一个字符串输入gets
#include
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
作用是。。。。清空缓存区!!!!
2.scanf(" %c")在百分号C前面加个空格
这时候没有空格Enter就输不进来了
3.scanf("%[^\n]",string);
这个我真他妈的看不懂
查查资料吧
scanf()的返回值是输入时匹配成功的项目数的数目。
#include
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是因为什么都没读到,而它又是在函数体中创建的,所以它的默认值是个随机值。
还是根据输入格式码确定的
%d 吃的是十进制整数 而且可以进行加减运算。
%c 吃的是字符 也包括空格和回车
%u unsiged类型
%s 读取字符串 但是遇到空格 EOF 或者到了限制长度 结束
%n 不读取字符 而是把处理的字符总数输入到指定变量中
%p 读取变量所在地址
%[] 读取[]中所存在的东西
%% 读取%???(这个实在是费解 我再查查资料)
%e,g,a 和f一样
2.getchar()函数
其实getchar和scanf一样也是要注意缓存区的问题。
getchar也是可以吃空格和回车的,所以在进行字符串输入时要注意这个问题。
#include
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
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函数是个字符串处理函数
作用:
其实我自己从来不用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点了
妈的我觉得边写边找资料已经四五个小时了
本来想学高数的
在下渣渣
错误还望指出
然后祝我期末全科不挂
呵呵