0求助,话说getline到底咋用?

P1308 [NOIP2011 普及组] 统计单词数

```cpp #include<bits/stdc++.h> using namespace std; bool flag; string a,b; int la,lb,c,d; int main() { getline(cin,a); getline(cin,b); a=" "+a+" "; b=" "+b+" "; for(int i=1; i<=la; i++) { if(64<a[i]&&a[i]<91) { a[i]+=32; } } for(int i=1; i<=lb; i++) { if(64<b[i]&&b[i]<91) { b[i]+=32; } } for(int i=0; i<lb; i++) { if(b[i]!=' ') { continue; } flag=1; for(int j=0; j<=la; j++) { if(a[i]!=b[i]) { flag=0; break; } } if(flag) { c++; if(!~d) { d=i; } } } if(!~d) { cout<<d<<'\n'; } else { cout<<c<<" "<<d<<"\n"; } return 0; } ``` 这是改的,还是不对
by kevin3 @ 2023-02-28 21:50:34


用样例解释: * 输入是 ```plain |To to be or not to be is a question ``` 其中的光标 `|` 表示当前输入流的位置。 * `cin >> a` 输入光标后紧随的一个单词(a ← “`To`”),并移动光标到单词后面: ```plain To| to be or not to be is a question ``` * `getline(cin, b)` 输入光标所在行的剩余内容(b ← “` `”),并移动光标到下一行开头。 ```plain To |to be or not to be is a question ``` 这样出错了。 修正的办法是在合适的位置加一句 `cin.ignore(numeric_limits<streamsize>::max(), '\n')`(它会直接把光标移动到下一行开头,不进行输入)。
by ud2_ @ 2023-02-28 21:58:07


另外注意回车,[它和换行不是同一个东西](/blog/_post/285227)。
by ud2_ @ 2023-02-28 21:59:30


@[ud2_](/user/206953) WA
by kevin3 @ 2023-02-28 22:04:25


@[ud2_](/user/206953) 打两行之后不输出了
by kevin3 @ 2023-02-28 22:06:52


@[kevin3](/user/735452) 后面还有些越界或者没初始化之类的小错误,仔细看。
by ud2_ @ 2023-02-28 22:12:27


@[ud2_](/user/206953) 可是之前输出啊
by kevin3 @ 2023-02-28 22:14:38


@[kevin3](/user/735452) 有输出不能说明代码对。 ```diff @@ -2,29 +2,37 @@ using namespace std; bool flag; string a,b; -int la,lb,c,d; +int la,lb,c,d=-1; int main() { getline(cin,a); getline(cin,b); + if (!a.empty() && a.back() == '\r') { + a.pop_back(); + } + if (!b.empty() && b.back() == '\r') { + b.pop_back(); + } a=" "+a+" "; b=" "+b+" "; - for(int i=1; i<=la; i++) { + la=a.length(); + lb=b.length(); + for(int i=0; i<la; i++) { if(64<a[i]&&a[i]<91) { a[i]+=32; } } - for(int i=1; i<=lb; i++) { + for(int i=0; i<lb; i++) { if(64<b[i]&&b[i]<91) { b[i]+=32; } } - for(int i=0; i<lb; i++) { + for(int i=0; i<lb-1; i++) { if(b[i]!=' ') { continue; } flag=1; - for(int j=0; j<=la; j++) { - if(a[i]!=b[i]) { + for(int j=0; j<la; j++) { + if(a[j]!=b[i+j]) { flag=0; break; } ```
by ud2_ @ 2023-02-28 22:19:44


```cpp #include<bits/stdc++.h> using namespace std; bool flag; string a,b; int la,lb,c,d=-1; int main() { getline(cin,a); getline(cin,b); a=" "+a+" "; b=" "+b+" "; la=a.size(); lb=b.size(); for(int i=1; i<=la; i++) { if(64<a[i]&&a[i]<91) { a[i]+=32; } } for(int i=1; i<=lb; i++) { if(64<b[i]&&b[i]<91) { b[i]+=32; } } for(int i=0; i<lb; i++) { if(b[i]!=' ') { continue; } flag=1; for(int j=0; j<=la; j++) { if(a[j]!=b[i]) { flag=0; break; } } if(flag) { c++; if(!~d) { d=i; } } } if(!~d) { cout<<d<<'\n'; } else { cout<<c<<" "<<d<<"\n"; } return 0; } ``` 20
by kevin3 @ 2023-02-28 22:25:32


|