字符串快读
  • 板块学术版
  • 楼主Taoran_01
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/11 16:50
  • 上次更新2024/4/11 19:06:00
查看原帖
字符串快读
593907
Taoran_01楼主2024/4/11 16:50

字符串快读


问题

我觉得我写的这段代码有些问题,但是我不知道错在哪里。有一道题过不去,但换成scanf()就过去了。

我希望能找到一组hack\text{hack}数据或一个不合适的场景。

各位Dalao\textit{\textrm{Dalao}}帮忙调一下吧,谢谢!


代码

char buf[1<<20], *p1, *p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?0:*p1++)

void getstr(char* s, ll &len) {
	memset(s, 0, sizeof(s));
	char ch=getchar(); len=0;
	while (ch<'a'||ch>'z') ch=getchar();
	while (ch>='a'&&ch<='z') s[++len]=ch, ch=getchar();
}


使用说明

getstr(s, n)

调用:
s:指针,指向char s[0];
n:整型变量,字符串长度。

行为:
从输入流读入一个小写字母组成的字符串,存储到s中,长度存储到n中。

注意:
s可以换成其它字符串,名字可以不是s,可以不是空的。
不可与scanf同时使用。


调用场景

给定nn个字符串,每个字符串一行。输出nn、字符串和字符串长度。

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;

char buf[1<<20], *p1, *p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?0:*p1++)

inline ll read() {
	ll 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<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}

#define N 1000010
ll n, len;
char s[N];

void getstr(char* s, ll &len) {
	memset(s, 0, sizeof(s));
	char ch=getchar(); len=0;
	while (ch<'a'||ch>'z') ch=getchar();
	while (ch>='a'&&ch<='z') s[++len]=ch, ch=getchar();
}

signed main() {
	n=read();
	printf("n=%lld\n", n);
	while (n--) {
		getstr(s, len);
		printf("s=\"%s\", len=%lld\n", s+1, len);
	}
	return 0;
}

2024/4/11 16:50
加载中...