【YbtOJ】單詞替換
阿新 • • 發佈:2022-03-04
一個 \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)
(不過這裡 s
為 string
型)
我在思考這組資料是巧合還是特意卡我這種人呢(畢竟在 openjudge 上都AC了