以下内容或者截图部分取自CSDN的博客内容,侵删噢
1.scanf和gets连用时注意的问题以及相关用法
一般来说gets和scanf避免一起用,要用也是gets先用,scanf后用,如果scanf在gets前就会出现异常:
注意:scanf和scanf连用同理
解决办法:加一个getchar()或者fflush(stdin)
getchar的用法:
2.scanf 的用法解析
其调用格式为:scanf("<格式化字符串>",<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF
2.1scanf函数的控制串使用
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d",a,b,c);
//注:scanf里面的变量一定要加地址符: &
//合法输入:(□..□意思是若干个空格或者tab)
//1□..□2□..□3 ↙
//1↙ 2□..□3↙
}
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
printf("%d,%d,%d",a,b,c);
//合法输入:
//1,□..□2,□..□3 ↙
//非法输入:
//1□..□ ,□..□2,□..□3 ↙//总结原因:scanf的输入格式必须按照“”内的内容输入
//如:scanf("a=%d",&a);也要完整输入:a=?
//scanf在输入有效数据后,遇到以下情况结束该数据输入(不是结束scanf而是结束该数据输入):
//回车,空格,tab,非法输入//注意:scanf不能输入带空格的字符串如i love u
2.2 scanf输入字符串
scanf()扫描到"i"后面的空格就认为对s的赋值结束,并忽略后面的"love China".这里要注意是"love China"还在键盘缓冲区(关于这个问题,网上我所见的说法都是如此,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)
r如果需要清楚缓存区,可参照上文1.添加getchar; 或者getch;或者 fflush(stdin);
其中,fflush(stdin);是最好的办法,前两者需要讨论情况(其实我了解的也不太深刻所以不能给出合理的解释)
3.sizeof和strlen的区别
//sizeof 和strlenchar a[5][10]={"qwer","aa","saddadsa","ddd"};int len =strlen(a[1]);//四个元素分别是4 2 8 3的长度,因为不算空格int len1=sizeof(a[1]);//四个元素都是10,因为要算空格,而10是因为二维数组的一为=维有10个大小啊a[][10]printf("%d",len);
期间还遇到了指针遍历数组最后一个元素出错的问题,在此记录一下
char a[81];fgets(a,81,stdin);char *p,*q;printf("%d %dn",strlen(a),strlen("asdasd"));//同样的字符串,用fgets输入后计算strlen比scanf输入要多1,q=a+strlen(a)-2; //因为fgets会自动添加一个'n'printf("%c",*q); //输入a12345678,字符串长度是10,因为字符长度9+'