atoi函数与scanf中%*c及%[^\n]的简单讲解
2016-05-02 22:06
197 查看
本次讲解将结合:NYOJ-96-n-1位数 进行讲解。
题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=96
题目大意:
输出一个数的除第一位数后面的数,要求去掉前置0,例如:输入1000100,那么输出就是100
首先明确一个神奇的东西~~~
执行下面一段代码:
输入:00000001
你以为会输出啥?00000001?
还真不是,正确答案是:
第一次知道是我也是懵逼的~~~
明确了这个之后,这里就有两种做法,首先介绍atoi( )函数,这个函数的功能是是将字符串转换为int 型的整数。
具体用法在这里:
http://www.cplusplus.com/reference/cstdlib/atoi/
相同的也有:
atol
Convert string to long integer (function )
atof
Convert string to double (function )
strtol
Convert string to long integer (function )
所以根据这个思路,我们只需读入字符串,然后将第一个字符变为 ‘0’;
这样输出的数就是符合要求的了。、
代码如下:
运行样例:
接下来就是第二种同样神奇的做法,在scanf中使用%*c;
首先介绍在scanf中加*的作用,就是跳过当前输入值,即不赋值给任何变量。
那么就可以利用这个方法来跳过第一个数了;
下面引自:
作者:王朝
链接:http://www.zhihu.com/question/20615836/answer/26225662
来源:知乎
对于输入字符串还有一些比较有用的控制,
经常需要读入一行字符串,而这串字符里面可能有空格、制表符等空白字符,
如果直接用%s是不可以的,于是有些人就想到用gets(),当然这也是一种选择,
但是懂C的人基本上都知道gets()是一个很危险的函数,而且很难控制,
特别是与scanf()交替使用时前者的劣势更是一览无余,所以gets()一般是不推荐用的,
其实用%[^\n]就可以很好的解决这个问题了,
^表示”非”,即读入其后面的字符就结束读入。
这样想读入一行字符串带空格的字符直接用:
就可以了,
%*c的作用也是读入\n,否则后面读入的将一直是\n。
为方便叙述,将
分成
可能读也可能不读
代码如下:
仅代表个人观点,欢迎交流探讨,勿喷~~~
PhotoBy:WLOP
http://weibo.com/wlop
题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=96
题目大意:
输出一个数的除第一位数后面的数,要求去掉前置0,例如:输入1000100,那么输出就是100
首先明确一个神奇的东西~~~
执行下面一段代码:
#include <stdio.h> int main() { int m; scanf("%d",&m); printf("%d",m); return 0; }
输入:00000001
你以为会输出啥?00000001?
还真不是,正确答案是:
第一次知道是我也是懵逼的~~~
明确了这个之后,这里就有两种做法,首先介绍atoi( )函数,这个函数的功能是是将字符串转换为int 型的整数。
具体用法在这里:
http://www.cplusplus.com/reference/cstdlib/atoi/
相同的也有:
atol
Convert string to long integer (function )
atof
Convert string to double (function )
strtol
Convert string to long integer (function )
所以根据这个思路,我们只需读入字符串,然后将第一个字符变为 ‘0’;
这样输出的数就是符合要求的了。、
代码如下:
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; int main() { int T; cin>>T; while(T--) { char str[1000010]; cin>>str; str[0]='0'; cout<<atoi(str)<<endl; } return 0; }
运行样例:
接下来就是第二种同样神奇的做法,在scanf中使用%*c;
首先介绍在scanf中加*的作用,就是跳过当前输入值,即不赋值给任何变量。
那么就可以利用这个方法来跳过第一个数了;
下面引自:
作者:王朝
链接:http://www.zhihu.com/question/20615836/answer/26225662
来源:知乎
对于输入字符串还有一些比较有用的控制,
经常需要读入一行字符串,而这串字符里面可能有空格、制表符等空白字符,
如果直接用%s是不可以的,于是有些人就想到用gets(),当然这也是一种选择,
但是懂C的人基本上都知道gets()是一个很危险的函数,而且很难控制,
特别是与scanf()交替使用时前者的劣势更是一览无余,所以gets()一般是不推荐用的,
其实用%[^\n]就可以很好的解决这个问题了,
^表示”非”,即读入其后面的字符就结束读入。
这样想读入一行字符串带空格的字符直接用:
scanf("%[^\n]%*c",str);
就可以了,
%*c的作用也是读入\n,否则后面读入的将一直是\n。
为方便叙述,将
scanf("\n%*c%d",&m)
分成
scanf("\n") 、scanf("%*c")、scanf("%d",&m)
scanf("\n“)对应的是输入流中0或多个连续空白字符(\n \t SPACE)
可能读也可能不读
getchar()则是必定读一个字符且无论是什么字符
scanf("%*c")是读一个字符但不存储
scanf("%*1d")则是读一个“十进制数字字符”但不存储
代码如下:
#include <iostream> #include <cstdio> using namespace std; int main() { int m; scanf("%d",&m); while(m--) { int n; getchar(); scanf("%*c%d",&n); printf("%d\n",n); } return 0; }
仅代表个人观点,欢迎交流探讨,勿喷~~~
PhotoBy:WLOP
http://weibo.com/wlop
相关文章推荐
- IPerf网络测试工具
- HDU1085 Holding Bin-Laden Captive!
- iOS --Runtime机制
- 【Unity】11.8 关节
- 1012-L专题三
- 第十一周上机实践项目——项目2-存储班长信息的学生类
- BestCoder Round #82 ztr loves lucky numbers
- LightOJ 1331-Agent J【计算几何】
- 不更水题了。。。
- Handler消息机制------->理解
- 【Unity】11.7 布料
- 基本程序结构
- java对redis的基本操作
- Variance-Covariance Matrix
- 计算机网络笔记之第一章概述
- 【Unity】11.6 恒定力 (Constant Force)
- HTML网页之学生成绩绩点计算代码
- 工作路径的切换
- Hiho+Trie数求字符串前缀的典型模板
- 六、树和二叉树--(1)什么是二叉树