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