代码改变世界

输入输出串小知识点

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;