1. 程式人生 > 其它 >【YbtOJ】單詞替換

【YbtOJ】單詞替換

一個 \r 引發的慘案

【YbtOJ】單詞替換

題面就不放了

整體思路挺簡單的

就是讀入句子,按空格分成若干單詞存起來

讀入單詞 \(a,b\) ,掃一遍存的單詞進行替換

最後輸出

如果按照正統做法其實到這裡就結束了

不算坑的坑

#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了