您的位置:首页 > 其它

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

首先明确一个神奇的东西~~~

执行下面一段代码:

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: