细节决定成败,scanf的这些坑点你知道吗?举例应用解析:DP最长公共子串

scanf坑点

无论是机试,蓝桥,PAT,一般都是喜欢用c + STL的方式进行编程,因此这scanf是个是必须要掌握的知识点,有人可能会问c++中的cin, cout,方便简介好用,但是其实cin,cout是以流的形式输入输出,因此其运行所用时间是远超于scanf,和printf的,因此建议平时练习的时候都采用scanf,和printf比较好。
知识点补充:

  1. 除了字符串(char 数组)外,其他都需要加&,如:char a[10] scanf("%s",a),因为a本身就是代表着第一个元素的地址。
  2. 除了%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 ̄)づ╭❤~
关注我和我一起共勉加油吧!
如果文章有错误,还望不吝指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值