当前位置:首页 > NOIP > 正文

NOIP基础-输入输出:巧用scanf宽度规范

NOIP中题目的变量定义、数组大小定义、输入输出写法也是很讲究的,新手在学习时还是要多练习,慢慢形成自己的函数库,先学习别人怎么写,慢慢积累,变成自己的函数库。


2022年种花的题目输入的要求如下:

输入格式
第一行包含两个整数 T,id,分别表示数据组数和测试点编号。如果数据为样例则保证 id=0。
接下来一共 T 组数据,在每组数据中:
第一行包含四个整数 n,m,c,f,其中 n,m 分别表示花园的行数、列数,对于c,f 的含义见输出格式部分。
接下来n 行,每行包含一个长度为 m 且仅包含 0 和 1 的字符串,其中第 i 个串的第 j 个字符表示 ai,j,
即花园里的第 i 行第 j 列是不是一个土坑。
输入样例:
1 0
4 3 1 1
001
010
000
000

输出
4 2


这里面的二维数组的输入方式就跟平时练习不太一样,是一行一行输入的。

就是一个嵌套循环,加字符转整型,代码如下:

#include <bits/stdc++.h>
#define ll long long 
using namespace std;
const int p=998244353;

int T,id,n,m,c,f;
ll a[1005][1005];
char s[1005];			


int main(){
	scanf("%d%d",&T,&id);

	while(T--){
		scanf("%d%d%d%d",&n,&m,&c,&f);


		for(int i=1;i<=n;i++){
			scanf("%s",s);//这里换成gets(s)为什么不行呢?
			for(int j=0;j<m;j++){
				a[i][j+1]=s[j]-'0';
			}
		}

		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				printf("%lld",a[i][j]);
			}
			printf("\n");
		}
	}


}


题解中看到一位大神用scanf加上参数%1lld,表示每次读取1位整数,搜索了一下用法,果然好用

char str[21];
scanf_s("%20s", str, 21);

上面示例中,宽度规范为 20,这表示从输入流中最多可读取 20 个字符。 缓冲区长度为 21,其中包括用于可能 20 个字符以及 null 终止符的空间;

如果未使用 width 字段,则 scanf_s 会尝试将整个标记读取到字符串中。 如果指定的大小不足以容纳整个标记,则不会向目标字符串写入任何内容。 如果指定了 width 字段,则将标记中的第一个 width 字符与 null 终止符一起写入目标字符串。

#include <bits/stdc++.h>
#define ll long long 
using namespace std;
const int p=998244353;

int T,id,n,m,c,f;
ll a[1005][1005];
char s[1005];	


inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}

int main()
{
	T=read(),id=read();
	while(T--){
        n=read(),m=read(),c=read(),f=read();
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%1lld",&a[i][j]);//这里每次读取1位,字符会自动转换成lld整型存入数组a
            }
        }


       	printf("your input:\n");

		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				printf("%lld",a[i][j]);
			}
			printf("\n");
		}

	}



}


更新时间 2023-02-06

有话要说...