C++stringクラスを用いた文字列の分解について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ドイ

C++stringクラスを用いた文字列の分解について

#1

投稿記事 by ドイ » 12年前

いつもお世話になっております。ドイです。
C++でstringクラスを用いた文字列分解プログラムを書いているのですが
分解は成功しているようなのですが2つめ以降の分解した結果が表示されなくて
行き詰まってしまいました。
この原因がわからないので皆さんのお力をお借りしたいと思います
どうかよろしくお願いします。

コード:

#include<iostream.h>
#include<string>

int explode(string kugiri, string t, string result[100]);//関数のプロトタイプ宣言


main(){
	
	string t = "http://www.aichi-edu.ac.jp/intro/index.html"; //分割用文字列
	string result[100];// 分割後の文字列格納用配列
	string kugiri = "/";// セパレータ

	
	
	cout <<"文字列を指定された区切り文字毎に分解するプログラムです。\n文字列「http://www.aichi-edu.ac.jp/intro/index.html」"<<endl;
	
	int n = explode(kugiri, t, result);//関数呼び出し
	
	cout << n << "個に分割されました\n"<<endl;
	
	return 0;
}

int explode(string kugiri, string t, string result[]){
	string::size_type index; //結果を代入する変数
	int length = t.length();
	
	for(int i=0 ; i<100 ; i++){
		index = t.find(kugiri);
		if(index == string::npos){ //もしセパレータが見つからなければ
			break;
		}
		
		result[i] = t.substr(0, index);
		
		cout<<"["<<i<<"]"<<result[i]<<endl;
		
		t = t.substr(index+length);
		
	}
	return 0;
}

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: C++stringクラスを用いた文字列の分解について

#2

投稿記事 by YuO » 12年前

ドイ さんが書きました:C++でstringクラスを用いた文字列分解プログラムを書いているのですが
分解は成功しているようなのですが2つめ以降の分解した結果が表示されなくて
行き詰まってしまいました。
「分解は成功している」と考えた根拠は何ですか。
こちらで試したところ,明らかに文字列の分割に失敗していましたが。
オフトピック
<iostream.h>という過去の遺物を使っている,<string>を使っているのに名前空間がないのでコンパイルに失敗する,というのは差し引いています。
ドイ さんが書きました:

コード:

int explode(string kugiri, string t, string result[]){
	string::size_type index; //結果を代入する変数
	int length = t.length();
ここで代入された「length」は,「t」の長さ,つまりは入力文字列の長さです。
ドイ さんが書きました:

コード:

		t = t.substr(index+length);
ここで,index + lengthはindex > 0において,tの長さよりも大きい値になります。
std::basic_string<>::substr(pos, n) constのRequiesには,pos <= size()と書かれており,
さらに,Throwsにはout_of_rangeif pos > size()と書かれています。
よって,out_of_range例外が発生します。
refs) ISO/IEC 14882:2011 21.4.7.8

そもそも,lengthはtの長さではなくkugiriの長さであるべきだったのではないでしょうか。
オフトピック
とりあえず,ソースデバッグ可能な環境を作るべきかと。
Visual C++でもEclipse CDTでもいいですが,デバッグ実行すると,catchされない例外が発生した時点でデバッガが止まります。
そして,その時点での変数の値も取得可能です。
ちゃんと,その時点の変数の値を見て考えれば,今回の問題は解決できたと思うのですが。

閉鎖

“C言語何でも質問掲示板” へ戻る