C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

空白を含めた数字入力、及び、区切り /ぷら (19/06/13(Thu) 07:57) #91295
Re[1]: 空白を含めた数字入力、及び、区切り /774RR (19/06/13(Thu) 09:23) #91297
  └ Re[2]: 空白を含めた数字入力、及び、区切り /ぷら (19/06/13(Thu) 18:44) #91304 解決済み


親記事 / ▼[ 91297 ]
■91295 / 親階層)  空白を含めた数字入力、及び、区切り
□投稿者/ ぷら (2回)-(2019/06/13(Thu) 07:57:50)

分類:[C/C++] 

ふと疑問に思ったことがあります。(効率が悪いという点は置いておくとして、振る舞いに疑問を抱きました。)
標準入力による空白を含む文字列があり、これをカンマ区切りにし、整数に変換した結果はどういう振る舞いをするのかということです。

キーボードで 1,2, 3,4 , 5 ,6 1,7 みたいな空白を含む入力があったと想定します。
ここで str_B[4]、入力では両側に空白がある" 5 "に当たるところに着目して考えたとき。

@標準入力cinでは空白を受け付けず、対応方法はcin.getlineがあるかと思います。
Aそして、カンマ区切りすると単純に、str_B[4]=" 5 "と両側に空白が含まれた状態なのですか?
Bもし、stoiで整数化したときには、空白のせいで整数ではないと判定して0を返すのか、空白を無視して5と返してくれるのかどちらでしょうか。

予想では str_B[5]="6 1"というケースもあるので0を返すのかなと思っています。
もし、0を返すという場合、str_B[5]というケースを想定しない場合で、空白を含む文字列を整数化する方法って存在したりしますか?



string str str_B;
stringstream str_A{str};

cin.getline(str,str.size());               …@
while (getline(str_A, num, ',')){str_B.push_back(num);}  …A
int hoge = stoi(str_B[4].c_str());            …B
[ □ Tree ] 返信 編集キー/

▲[ 91295 ] / ▼[ 91304 ]
■91297 / 1階層)  Re[1]: 空白を含めた数字入力、及び、区切り
□投稿者/ 774RR (697回)-(2019/06/13(Thu) 09:23:16)
えっとその辺は自分で実験したほうが早いと思うが・・・

文字(列)を扱う関数は指定以外の文字を特別扱いしないから
1. cin は空白を特別扱いせず受け付ける
2. 文字列をカンマで区切って別文字列を作ったのならスペースはそのまま

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/strtol.3.html
3. 伝統的に C/C++ の文字列→数値変換関数は、次の仕様
 - 先頭に空白類があると、それはエラーにせずに読み飛ばす
 - 空白類でない文字を見つけたら、そこから処理開始
 - 当該 [型] の数値として解釈できる限り変換対象
 - 空白類や記号など数値として解釈できない文字が出たらそこまでで終了
 - このとき、解釈打ち切りの原因となった文字はバッファに残し、もし継続処理があったら再利用

#include <string>
#include <iostream>
#include <sstream>

int main() {
    std::string s;
    std::getline(std::cin, s); // 改行まで可変長文字列を読むならこっち
    std::cout << "<" << s << ">\n";
    std::stringstream ss(s);
    std::string x;
    while (std::getline(ss, x, ',')) { // 特定文字で区切るならこっち
	std::cout << "<" << x << ">\n";
	std::cout << std::stoi(x) << std::endl;
    }
}

なるソースコードに提示例の文字列を与えると分割後文字列 "6 1" に対して stoi 結果は 6 っす。

[ 親 91295 / □ Tree ] 返信 編集キー/

▲[ 91297 ] / 返信無し
■91304 / 2階層)  Re[2]: 空白を含めた数字入力、及び、区切り
□投稿者/ ぷら (3回)-(2019/06/13(Thu) 18:44:22)
cin >> hoge;
ではなく
getline(cin,hoge);
とすることで空白を含む1行を読み込むことが可能になり、全てが解決できるのですね。

ありがとうございました。
解決済み
[ 親 91295 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -