0%

【YbtOJ】单词替换

题面就不放了

整体思路挺简单的

就是读入句子,按空格分成若干单词存起来

读入单词 $a,b$ ,扫一遍存的单词进行替换

最后输出

如果按照正统做法其实到这里就结束了

不算坑的坑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>
using namespace std;

string S[10000];

int main(){
char s[150];
scanf("%[^\n]",s);
string f,t;
cin>>f>>t;
char wd[150];
int p = 0;
int ind = 0;
for(int i = 0;i<=strlen(s);i++){
if(s[i] == ' ' || i == strlen(s)){
wd[p] = '\0';
string SS = wd;
if(SS == f) SS = t;
S[ind++] = SS;
for(int j = 0;j<p;j++) wd[j] = '\0';
p = 0;
}else wd[p++] = s[i];
}
for(int i = 0;i<ind;i++){
cout<<S[i]<<" ";
}
return 0;
}

$\small\text{YbtOJ上的90分代码}$

但是,数据应该是在 $\text{Windows}$ 下出的

这意味着什么呢

$\text{Windows}$ 下的换行符是 \r\n

$\text{Linux}$ 下的换行符是 \n

这一点区别在使用 getline(cin,s) 的时候没有影响

但是当使用 scanf("%[^\n]") 的时候,问题出现了

scanf("%[^\n]")的意思是一直读,直到遇见 \n 为止

这会造成每一行最后一个字符串多读了一个 \r

多出来的这个 \r 会对字符串匹配造成影响

意思就是,一旦需要更改的字符串出现在原字符串的末尾,这个字符串是无法被匹配到并更改的

解决方法也很简单

只需要把 scanf("%[^\n]") 改成 scanf("%[^\r\n]") 即可

再或者直接用 getline(cin,s) (不过这里 sstring 型)

我在思考这组数据是巧合还是特意卡我这种人呢(毕竟在 openjudge 上都AC了