输入输出串小知识点
2017-11-25 10:48 小白很我 阅读(238) 评论(0) 编辑 收藏 举报#include <stdio.h>
int atoi (const char* nptr);
nptr 是一个以有数字或‘-’的字符开头+数字的字符串。反正从左往右碰到非数字字符(第一个可以是‘-’),就停止转换。
char tab[] = "345"
int a = atoi(tab); //a=345
--------------------------------------------------------------------------
char tab[] = "-125dsdgsah";
int a = atoi (tab); //a= -125
-------------------------------------------------------------------------
char tab[] = "+15645";
int a = atoi (tab); //a=15645
-------------------------------------------------------------------------
char tab[] = " 89849 ";
int a = atoi(tab) ; //a= 89849
---------------------------------------------------------------------------
char tab[] = "k25ds2";
int a = atoi (tab); //a= 0
--------------------------------------------------------------------------
如果你的数字很大可以,将数字转换成long ,long long 型;
long atol (const char* nptr);
long long atoll (const char* nptr);
规则是一个样子的。
char tab[20] = "3249237483439";
int a = atoi ( tab );
int b = (int)3249237483439;
a == b 的;
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下一个函数是 char* fget ( char* s, int size, FILE* stream);
从流中获取数据,填充到指定的地址出(s), 取多少字符,取决于下面几点:
1)取流缓冲区数据时,遇到‘\n’或EOF(0)时停止取字符;并且将字符+‘\n’取到s缓冲中;
2)流缓冲区很多数据,取了size-1个字符还没碰到'\n'和EOF,那么fgets就取size-1个字符到s缓冲区中,最后一个用‘\0’填充;
char tab1[3];
char tab2[3];
char tab3[3];
char tab4[3];
fgets(tab1, 3, stdin);
fgets(tab2, 3, stdin);
fgets(tab3, 3, stdin);
fgets(tab4, 3, stdin);
printf ( "%s\n", tab1);
printf ( "%s\n", tab2);
printf ( "%s\n", tab3);
printf ( "%s\n", tab4);
键盘输入:111111111111111111111111111111111111111111111111111
屏幕输出:
111
111
111
111
键盘输入:
1
1
1
1
屏幕输出 :
1
'\n'
1
'\n'
1
'\n'
1
说明‘\n’都被fgets获取并存起来了。
键盘输入:
111
11
屏幕输出:
11
1
‘\n’
11
'\n'
试验了这么久,就是说明了那两个规则;fgets就是一个不放过的读取然后存放到指定的内存处,而且只读取size-1个字符也是相当的安全,防止内存越界。
这很满足我的胃口,因为我就想要全部的输入,结果我自己会处理,而不是像scanf那样,严格按照条件进行读取存放。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
函数 : int scanf (const char *format, ...);
值得注意的是scanf的返回值,表示命中了几个格式控制符对应的数据,scanf("%d%d", &a, &b);返回2说明取到了2个整数给a和b,圆满完成任务;返回1,说明只有获取了一个整数,0表示一个整数都没有获取成功。因为获取规则的设定与输入缓冲区的字符不一致,会导致获取失败。当然还有其他的原因。
----------------------------------------------------------------------
scanf("%d", &a);
键盘输入:f字符,获取失败;缓冲区残留f字符+'\n';
键盘输入:空格123,获取成功,a = 123;scanf会忽略空格和'\n';缓冲区残留‘\n’
键盘输入:f34,获取失败;缓冲区残留'\n';
键盘输入:34f,获取成功;缓冲区残留'f'+'\n';
键盘输入:35 56,获取成功,缓冲区残留空格+56;
所以来获取输入时就是纯净的数字,就得留意一点了,用scanf("%d", &a),你是不知道用户输入的是不是纯数字的。
要获取用户输入的纯数字,而将345t这种数字排除掉,那就用字符串获取scanf(“%s”, &str),在自行处理。还有就是使用char* fgets(const char* s, int len, FILE * stream);
完全自己处理。
scanf ("%*s%d", &a);它会将缓冲区开始处以空格为分隔符的第一个字符串,读取并丢掉,然后读取数字给a;