atoi函数与scanf中%*c及%[^\n]的简单讲解

来源:互联网 发布:平板电脑软件下载 编辑:程序博客网 时间:2024/06/05 09:22

本次讲解将结合: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

0 0