scanf坑点
无论是机试,蓝桥,PAT,一般都是喜欢用c + STL的方式进行编程,因此这scanf是个是必须要掌握的知识点,有人可能会问c++中的cin, cout,方便简介好用,但是其实cin,cout是以流的形式输入输出,因此其运行所用时间是远超于scanf,和printf的,因此建议平时练习的时候都采用scanf,和printf比较好。
知识点补充:
- 除了字符串(char 数组)外,其他都需要加&,如:char a[10] scanf("%s",a),因为a本身就是代表着第一个元素的地址。
- 除了
%c
外,scanf对其他格式(如%d,%s,……)的输入是以空白符(即空格、Tab、、/n)为结束判断标志的。如:
scanf("%d%c%s",&a,&b,c); //input : 1 a abc
则输出:a=1,b= ,c=a;
因此在对于字符型的二维数组输入时则需要注意的点:
#include <cstdio>
#include <cstring>
int main(){
char a[3][3];
for(int i=0 ;i<3;i++){
for(int j=0;j<3;j++){
scanf("%c",&a[i][j]);
}
}
for(int i=0 ;i<3;i++){
for(int j=0;j<3;j++){
printf("a[%d][%d]:%c ",i,j,a[i][j]);
}
printf("\n");
}
return 0;
}
//当输入:
a b
c
e f
似乎感觉这样写没有半毛钱问题!!!!!
其结果
是这样的:
细品,你细品:
如果还没品到的话,请看:
主要原因:还是在于==%c==是可以获取到
tab
,\n
的,因此对于这种有换行和空格的图案输出题,很容易WA。
那怎么修改呢?
补充知识:
getchar
一个字符,一般用于scanf单独输入字符型数据时,用于去除<enter>键.
#include <cstdio>
#include <cstring>
int main(){
char a[3][3];
for(int i=0 ;i<3;i++){
for(int j=0;j<3;j++){
scanf("%c",&a[i][j]);
}
getchar();
}
for(int i=0 ;i<3;i++){
for(int j=0;j<3;j++){
printf("a[%d][%d]:%c ",i,j,a[i][j]);
}
printf("\n");
}
for(int i=0 ;i<3;i++){
for(int j=0;j<3;j++){
printf("%c ",a[i][j]);
}
printf("\n");
}
return 0;
}
gets() ,puts()
可以直接输入一行字符串,并且包含空格,如:
char b[3];
gets(b);
puts(b); //输出a b; 则输出a b;
另外还有一个getline()
c++中有一个特别好用的string 类型,定义字符串s,但是如果字符串中有空格的话,就需要用到getline出入,用于代替cin中输入带个空格的字符串。
/经典问题::最长公共子串问题
试题内容:
input
Input consists of pairs of lines. The first line of a pair contains the first string and the second line
contains the second string. Each string is on a separate line and consists of at most 1,000 characters
output
For each subsequent pair of input lines, output a line containing one integer number which satisfies the
criteria stated above.
Sample Input
bcacbcabbaccbab
bccabccbbabacbc
a1b2c3d4e
zz1yy2xx3ww4vv
abcdgh
aedfhr
abcdefghijklmnopqrstuvwxyz
a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0
abcdefghijklmnzyxwvutsrqpo
opqrstuvwxyzabcdefghijklmn
Sample Output
11
4
3
26
14
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 1000 + 10;
string a, b;
int dp[maxn][maxn];
int max(int a, int b) {
if (a < b)return b;
return a;
}
int main() {
int n;
while (getline(cin,a)) {//之前写了cin>>a,就WA掉了
getline(cin, b);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= a.size(); i++) {
for (int j = 1; j <= b.size(); j++) {
if (a[i - 1] == b[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
printf("%d\n", dp[a.size()][b.size()]);
}
return 0;
}
勉励
打卡第五天,加油ヾ(◍°∇°◍)ノ゙
如果觉得我的文章对你有所帮助与启发,点赞给我个鼓励吧(づ ̄3 ̄)づ╭❤~
关注我和我一起共勉加油
吧!
如果文章有错误,还望不吝指教!