#12056: C++ 使用getline遇到的問題


davistonyhsu (曉石之音)

學校 : 國立臺灣科技大學
編號 : 30915
來源 : [123.193.103.104]
最後登入時間 :
2024-02-17 09:31:18
a221. 11734 - Big Number of Teams will Solve This -- UVa11734 | From: [101.15.179.117] | 發表日期 : 2017-05-23 00:07

雖然C語言使用gets似乎沒有問題,但是C++在使用getline的時候會抓到換行符號(黑人問號??)

我自己也好奇是測資塞的還是系統問題,所以我對於輸入的字串有再處理換行符號

字串處理完之後就能照我的想法AC了,競賽應該不至於有這問題

 
#12057: Re:C++ 使用getline遇到的問題


anandrewboy70900 (ShowTsai)

學校 : 國立中央大學
編號 : 27736
來源 : [203.204.218.144]
最後登入時間 :
2024-02-07 22:53:10
a221. 11734 - Big Number of Teams will Solve This -- UVa11734 | From: [140.115.204.235] | 發表日期 : 2017-05-23 00:18

 

一開始輸入n之後

呼叫個cin >> ws




 
#12058: Re:C++ 使用getline遇到的問題


nkavengertree (LaG)

學校 : 不指定學校
編號 : 62501
來源 : [49.216.191.28]
最後登入時間 :
2021-11-21 03:06:49
a221. 11734 - Big Number of Teams will Solve This -- UVa11734 | From: [163.30.20.150] | 發表日期 : 2017-05-23 10:22

雖然C語言使用gets似乎沒有問題,但是C++在使用getline的時候會抓到換行符號(黑人問號??)

我自己也好奇是測資塞的還是系統問題,所以我對於輸入的字串有再處理換行符號

字串處理完之後就能照我的想法AC了,競賽應該不至於有這問題

getline( cin , str ); 應該讀取整行是沒有錯的

但是一開始使用cin 去讀取數字的時候

並沒有把換行讀進去

所以剩下一個 (空字串) + (一個換行) 

 

像題目一開始輸入: 3\n

通常都是用cin >> t;讀取

這個時候若要再用getline去讀整行的情況

記得要用cin.get();把空字串讀掉


如果不放心的話

可以這樣

do{

cin.get( next_char );

}while ( next_char != '\n');

 

 

 

 

 

 

 
#12059: Re:C++ 使用getline遇到的問題


davistonyhsu (曉石之音)

學校 : 國立臺灣科技大學
編號 : 30915
來源 : [123.193.103.104]
最後登入時間 :
2024-02-17 09:31:18
a221. 11734 - Big Number of Teams will Solve This -- UVa11734 | From: [140.136.150.1] | 發表日期 : 2017-05-23 13:22

雖然C語言使用gets似乎沒有問題,但是C++在使用getline的時候會抓到換行符號(黑人問號??)

我自己也好奇是測資塞的還是系統問題,所以我對於輸入的字串有再處理換行符號

字串處理完之後就能照我的想法AC了,競賽應該不至於有這問題

getline( cin , str ); 應該讀取整行是沒有錯的

但是一開始使用cin 去讀取數字的時候

並沒有把換行讀進去

所以剩下一個 (空字串) + (一個換行) 

 

像題目一開始輸入: 3\n

通常都是用cin >> t;讀取

這個時候若要再用getline去讀整行的情況

記得要用cin.get();把空字串讀掉


如果不放心的話

可以這樣

do{

cin.get( next_char );

}while ( next_char != '\n');

 

 

 

 

 

 

我也是認為getline會讀取整行,所以將所有涉及讀取的部分全部使用getline實行,目的跟你的想法一樣

你們可以用下面的程式碼測試看看

#include <iostream>

#include <algorithm>

#include <string>

#include <iterator>

 

using namespace std;

 

int main (){

  int n;

  string sn;

  while(getline(cin, sn)){

    n = stoi(sn);

    for(int i = 1; i <= n; i++){

      string s1, s2;

      getline(cin, s1);

      getline(cin, s2);

      copy(s1.begin(), s1.end(), ostream_iterator<int>(cout, " "));

      cout << endl;

      copy(s2.begin(), s2.end(), ostream_iterator<int>(cout, " "));

      cout << endl;

    }

  }

  return 0;

}

 

在迴圈內的兩行getline這裡會出問題,當時我把輸入字串整個用ascii number印出來才抓到這問題

至於你的cin.get做法我還沒嘗試過,這可能是比較不容易出狀況的方法吧

 
#12060: Re:C++ 使用getline遇到的問題


nkavengertree (LaG)

學校 : 不指定學校
編號 : 62501
來源 : [49.216.191.28]
最後登入時間 :
2021-11-21 03:06:49
a221. 11734 - Big Number of Teams will Solve This -- UVa11734 | From: [163.30.20.150] | 發表日期 : 2017-05-23 13:41

雖然C語言使用gets似乎沒有問題,但是C++在使用getline的時候會抓到換行符號(黑人問號??)

我自己也好奇是測資塞的還是系統問題,所以我對於輸入的字串有再處理換行符號

字串處理完之後就能照我的想法AC了,競賽應該不至於有這問題

getline( cin , str ); 應該讀取整行是沒有錯的

但是一開始使用cin 去讀取數字的時候

並沒有把換行讀進去

所以剩下一個 (空字串) + (一個換行) 

 

像題目一開始輸入: 3\n

通常都是用cin >> t;讀取

這個時候若要再用getline去讀整行的情況

記得要用cin.get();把空字串讀掉


如果不放心的話

可以這樣

do{

cin.get( next_char );

}while ( next_char != '\n');

 

 

 

 

 

 

我也是認為getline會讀取整行,所以將所有涉及讀取的部分全部使用getline實行,目的跟你的想法一樣

你們可以用下面的程式碼測試看看

#include

#include

#include

#include

 

using namespace std;

 

int main (){

  int n;

  string sn;

  while(getline(cin, sn)){

    n = stoi(sn);

    for(int i = 1; i <= n; i++){

      string s1, s2;

      getline(cin, s1);

      getline(cin, s2);

      copy(s1.begin(), s1.end(), ostream_iterator(cout, " "));

      cout << endl;

      copy(s2.begin(), s2.end(), ostream_iterator(cout, " "));

      cout << endl;

    }

  }

  return 0;

}

 

在迴圈內的兩行getline這裡會出問題,當時我把輸入字串整個用ascii number印出來才抓到這問題

至於你的cin.get做法我還沒嘗試過,這可能是比較不容易出狀況的方法吧

有發現什麼問題嗎

看起來都蠻正常的(用題目給的測資測)

 

 
#12064: Re:C++ 使用getline遇到的問題


davistonyhsu (曉石之音)

學校 : 國立臺灣科技大學
編號 : 30915
來源 : [123.193.103.104]
最後登入時間 :
2024-02-17 09:31:18
a221. 11734 - Big Number of Teams will Solve This -- UVa11734 | From: [101.8.50.152] | 發表日期 : 2017-05-23 20:09

雖然C語言使用gets似乎沒有問題,但是C++在使用getline的時候會抓到換行符號(黑人問號??)

我自己也好奇是測資塞的還是系統問題,所以我對於輸入的字串有再處理換行符號

字串處理完之後就能照我的想法AC了,競賽應該不至於有這問題

getline( cin , str ); 應該讀取整行是沒有錯的

但是一開始使用cin 去讀取數字的時候

並沒有把換行讀進去

所以剩下一個 (空字串) + (一個換行) 

 

像題目一開始輸入: 3\n

通常都是用cin >> t;讀取

這個時候若要再用getline去讀整行的情況

記得要用cin.get();把空字串讀掉


如果不放心的話

可以這樣

do{

cin.get( next_char );

}while ( next_char != '\n');

 

 

 

 

 

 

我也是認為getline會讀取整行,所以將所有涉及讀取的部分全部使用getline實行,目的跟你的想法一樣

你們可以用下面的程式碼測試看看

#include

#include

#include

#include

 

using namespace std;

 

int main (){

  int n;

  string sn;

  while(getline(cin, sn)){

    n = stoi(sn);

    for(int i = 1; i <= n; i++){

      string s1, s2;

      getline(cin, s1);

      getline(cin, s2);

      copy(s1.begin(), s1.end(), ostream_iterator(cout, " "));

      cout << endl;

      copy(s2.begin(), s2.end(), ostream_iterator(cout, " "));

      cout << endl;

    }

  }

  return 0;

}

 

在迴圈內的兩行getline這裡會出問題,當時我把輸入字串整個用ascii number印出來才抓到這問題

至於你的cin.get做法我還沒嘗試過,這可能是比較不容易出狀況的方法吧

有發現什麼問題嗎

看起來都蠻正常的(用題目給的測資測)

 


那就是我撞鬼了,我測出來的結果是這樣:

輸入測試如下:

1
yes
yes

預期結果如下:

121 101 115 
121 101 115 

在測試跑出來的結果如下

您的答案為: 121 101 115 13
正確答案為: 121 101 115

所以是我的撰寫該改善嗎?



 
#12065: Re:C++ 使用getline遇到的問題


nkavengertree (LaG)

學校 : 不指定學校
編號 : 62501
來源 : [49.216.191.28]
最後登入時間 :
2021-11-21 03:06:49
a221. 11734 - Big Number of Teams will Solve This -- UVa11734 | From: [163.30.20.150] | 發表日期 : 2017-05-24 08:35

雖然C語言使用gets似乎沒有問題,但是C++在使用getline的時候會抓到換行符號(黑人問號??)

我自己也好奇是測資塞的還是系統問題,所以我對於輸入的字串有再處理換行符號

字串處理完之後就能照我的想法AC了,競賽應該不至於有這問題

getline( cin , str ); 應該讀取整行是沒有錯的

但是一開始使用cin 去讀取數字的時候

並沒有把換行讀進去

所以剩下一個 (空字串) + (一個換行) 

 

像題目一開始輸入: 3\n

通常都是用cin >> t;讀取

這個時候若要再用getline去讀整行的情況

記得要用cin.get();把空字串讀掉


如果不放心的話

可以這樣

do{

cin.get( next_char );

}while ( next_char != '\n');

 

 

 

 

 

 

我也是認為getline會讀取整行,所以將所有涉及讀取的部分全部使用getline實行,目的跟你的想法一樣

你們可以用下面的程式碼測試看看

#include

#include

#include

#include

 

using namespace std;

 

int main (){

  int n;

  string sn;

  while(getline(cin, sn)){

    n = stoi(sn);

    for(int i = 1; i <= n; i++){

      string s1, s2;

      getline(cin, s1);

      getline(cin, s2);

      copy(s1.begin(), s1.end(), ostream_iterator(cout, " "));

      cout << endl;

      copy(s2.begin(), s2.end(), ostream_iterator(cout, " "));

      cout << endl;

    }

  }

  return 0;

}

 

在迴圈內的兩行getline這裡會出問題,當時我把輸入字串整個用ascii number印出來才抓到這問題

至於你的cin.get做法我還沒嘗試過,這可能是比較不容易出狀況的方法吧

有發現什麼問題嗎

看起來都蠻正常的(用題目給的測資測)

 


那就是我撞鬼了,我測出來的結果是這樣:

輸入測試如下:

1
yes
yes

預期結果如下:

121 101 115 
121 101 115 

在測試跑出來的結果如下

您的答案為: 121 101 115 13
正確答案為: 121 101 115

所以是我的撰寫該改善嗎?



真的嗎!!!

我用你的程式跑

結果是

121 101 115

121 101 115

並沒有看到有多的13出現 (使用的是 Code:Blocks 16.01)

 
ZeroJudge Forum