STL string::findで見つからなかった時の書式を教えて下さい。

このQ&Aのポイント
  • STLのstring::find関数を使用して文字列を検索する際、見つからなかった場合の書式について教えてください。
  • また、error C2065: 'npos' : 定義されていない識別子です。というエラーメッセージが表示されます。正しい識別子を使用する方法も教えてください。
  • basic_string::nposは、size_type型で表現できる最大の値であり、非常に大きな値または特殊なコードとして使用できます。
回答を見る
  • ベストアンサー

STL string::findで見つからなかった時

STL string::findで見つからなかった時の 書式を教えて下さい。 <-----ソース start-------> #define UNCODE #define _UNCODE #pragma warning( push,3 ) #pragma warning( disable : 4786 ) // 識別子が '255' 文字に切り捨 #include <iostream> #include <string> #include <vector> #pragma warning( pop ) #pragma warning( disable : 4514 ) // 参照されていないインライン関数は削除 #pragma warning( disable : 4786 ) // 識別子が '255' 文字に切り捨 int wmain(int iArgC, wchar_t* ArgV[], wchar_t* EnvP[]) {  setlocale( LC_ALL, "Japanese" );  std::vector<std::wstring> m_sEnv;  std::vector<std::wstring> m_sArg;  unsigned long lLoop;  unsigned long lPos;  for (lLoop=0; lLoop<(unsigned long)iArgC; lLoop++) {   m_sArg.push_back(ArgV[lLoop]);  }  for (lLoop=0;;lLoop++) {   if (EnvP[lLoop] == NULL) break;   m_sEnv.push_back(EnvP[lLoop]);  }  for (lLoop=0;lLoop<m_sEnv.size();lLoop++) {   if ((lPos = m_sEnv.at(lLoop).find(L"jdk1")) != npos) { // *1    std::wcout << m_sEnv.at(lLoop) << std::endl;   }  }  return 0; } <-----ソース end-------> *1 で error C2065: 'npos' : 定義されていない識別子です。 「std::npos」も試したけどだめだった。 >>以下MSDNより >>basic_string::npos >>static const size_type npos = -1; >>この定数は、size_type 型として表現できる最大の値です。 >>max_size() よりも大きいことが保証されるため、 >>非常に大きな値または特殊なコードとして使用できます。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

最近の STL は良く知らないんですけど、npos は ・std::wstring::npos ・std::basic_string::npos のどちらかだと思います。

nakashi
質問者

お礼

std::wstring::npos で通りました

関連するQ&A

  • STLのwstring型から BSTR型 への変換

    // STLのwstring型から BSTR型 への変換てこんな感じでいいのでしょうか? #pragma warning(push,3) #include <string> #pragma warning(pop) #include <Windows.h> void main(void) {  std::wstring sString1 = L"This is STL_wstring";  std::wstring sString2;  BSTR sWork1 = ::SysAllocString(L"This is BSTR\n");  BSTR sWork2;  sString2 = sWork1;  sWork2 = ::SysAllocString(sString1.c_str()); // ここ  ::SysFreeString(sWork1);  ::SysFreeString(sWork2); }

  • STLのstringのサイズが0なのに、printfできちゃうのはなぜ

    STLのstringのサイズが0なのに、printfできちゃうのはなぜ? たとえば、以下のような小文字変換処理を考えます。 std::string str = "ABC"; std::string strTmp = ""; std::transform( str.begin(), str.end(), strTmp.begin(), ptr_fun(::tolower) ); この時、strTmpには"abc"が入っていると思っていたのですが、 strTmp.compare("abc") が0になりませんでした。strTmp.size()が0になっており、どうも空文字""と認識されているようです。 ですが、 printf( strTmp.c_str() ); とすると、"abc"と出力されます。printfで上記のようにデバッグしていたので、なかなかミスが発見できなかったのですが、strTmpの初期化で""を入れているために、compareがうまく動かなかったようです。 std::string strTmp = ""; のところを std::string strTmp = str ; と直すと、compareが期待通りに動きました。 長くなってすみませんが、ここからが質問です。 1.stringの初期化時に確保した文字列長は、その後変更できないのでしょうか?今まで、普通に""で初期化した後、別の文字列を代入したりしていたような気がするのですが…。 2.strTmpのサイズが0にもかかわらず、printfで(一見)期待通りの結果が出力されたのは、なぜでしょうか?printfは、ヌル文字までを出力する仕様みたいですが、そもそもstringのsize()も、ヌル文字までの長さを返すのではなかったでしょうか。 全ソースは、以下の通りです。 #include <string> #include <algorithm> #include <functional> #include <ctype.h> #include <stdio.h> int main() {  std::string str = "ABC";  std::string strTmp = ""; // strにすると動く  std::transform( str.begin(), str.end(), strTmp.begin(), std::ptr_fun(::tolower) );  printf( "compare = %d\n", strTmp.compare("abc") );  printf( "size = %d\n", (int)strTmp.size() );  printf( "strTmp = %s\n", strTmp.c_str() );  return 0; }

  • std::wstringの継承

    #include<iostream> #include<string> #include <stdlib.h> #include <locale.h> #include <boost/lexical_cast.hpp> using boost::lexical_cast; using namespace std; VisualC++2008ExpressEditionで文字や数字を簡単に扱えるクラスを今作ろうとしていて以下のように作ってみました。 class multiString:public std::wstring{ public:   multiString(const wchar_t *ws){     /* multiString class自体に代入 */   } }; しかし、このwchar_tをクラスに代入する処理として、 multiString(const wchar_t *s)std::wstring(s); とすると、「error C2082: 仮パラメータ 's' が再定義されました。」となりますし、 multiString(const wchar_t *s)*this=s; とすると、例外が発生してしまします。 wstringだったら、簡単に代入処理として出来るのですが、継承した場合はどの様に実装すればいいのでしょうか? 宜しくお願いします。

  • ヘッダーファイルがインクルードされない(?)

    ダイアログ上のボタンをクリックすると指定されたテキストファイルをオープンし、 ファイルの内容をスペースで区切って格納するプログラムを http://oshiete1.goo.ne.jp/kotaeru.php3?q=474452 こちらを少し変えて作ったのですが、 コンパイル・デバッグを行なうと 'std' : 識別子がクラス名でも名前空間名でもありません。 'vector' : 定義されていない識別子です。 'ofstream' : 定義されていない識別子です。 と言ったようなエラーになってしまいます。 必要なヘッダーファイルはインクルードされているはずなのですが・・・。 この原因は何故でしょうか? /**********プログラムソース**********/ #include <iostream> #include <fstream> #include <string> #include <vector> #include <utility> #include "stdafx.h" #include "SCHEDULE.h" #include "SCHEDULEDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // ~中略~ void CSCHEDULEDlg::OnReq() {    typedef std::pair<std::string,std::string> item;    std::vector<item> participation;    std::ofstream file(dataFile.txt);    std::string line;    while ( std::getline(file,line) ) {      std::string::size_type pos = line.find(' ');      participation.push_back(item(line.substr(0,pos), line.substr(pos+1)));    }    for ( int i = 0; i < participation.size(); ++ i) {      std::cout << "result = " << participation[j] << "]\n";    } }

  • C++ STL vectorの使い方

    こんばんは。 C++のstd::vectorに関する質問です。 vectorをポインタ渡しにしたときに メンバにアクセスする方法を知りたいのですが・・・ 以下ソースの☆の部分をどう記述したらよいでしょう? #include <vector> typedef struct test {  char name[10];  char id[2]; } TEST; void funcVectorTest( std::vector<TEST> *a); int main(){  std::vector<TEST> a;  int i;  TEST foo= {"Taro","0"};  a.push_back(foo);  printf("%s",a[0].name);  a.push_back(foo);  printf("%s",a[1].name);  funcVectorTest(&a);//vectorのアドレス渡しテスト  printf("%s", a[2].name);//vectorのアドレス渡し確認  return 0; } void funcVectorTest( std::vector<TEST> *a) {  int i;  int cnt;  TEST *b;  b = new TEST[3];  TEST foo= {"Taro","0"};  a->push_back(foo);  cnt = a->size();  for( i = 0; i < cnt;i++){  //以下でa[i]のnameにアクセスしたいのですがうまくいっていません。  //☆strcpy( b[i].name, a[i]->name );  }  delete[] b; } お分かりになる方、お知恵をお貸し下さい(><) vectorについて最近知ったばかりでいまいち使い方が 分かっていない部分があるので このやり方がまずいということであれば教えていただけると 助かります。 よろしくお願いしますm( _ _ )m

  • C++/STLの動作

    お世話になっております。 クラスのインスタンス化時に自身のポインタをストックしようと下記を実行しましたが、 出力が0となり、予想に反していました。 そこで、"test.cpp"の3行目を"main.cpp"に移動すると正しく動作します。 これはどういった動作が原因で起こったのでしょうか? よろしくお願いします。 /// test.h /// #include <vector> class Test { public: Test(){list.push_back(this);} static std::vector<Test*> list; }; /// test.cpp /// #include "test.h" std::vector<Test*> Test::list; /// main.cpp /// #include <stdio.h> #include "test.h" Test test; void main() { printf( "%d\n", test.list.size() ); // "1"と出力されると思ったけど… }

  • STLで、vectorのファイルへの書き出し、読み込み。

    STLで、vectorのファイルへの書き出し、読み込み。 C++ の STL で vector をファイルに書き出し、読み込もうとしておりまして、まずは書き出しで躓いております。 vector<int> testvector; for (i = 0 ; i < 10 ; i++) testvector.push_back( i ); ofstream out("test.dat", ios::out | ios::binary); if (!out) return 1; out.write((vector<int>) testvector, sizeof(testvector)); out.close(); こんな感じのコードですと、 error: no matching function for call to ‘std::basic_ofstream<char, std::char_traits<char> >::write(std::vector<int, std::allocator<int> >, long unsigned int)’ /usr/include/c++/4.2.1/bits/ostream.tcc:173: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::write(const _CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>] とのことです orz. どのようにすれば vector を書き出し、そして読み込むことができるのでしょうか。情報がありましたら是非お寄せください。

  • STLのvectorで・・・

    4次元配列を使いたいので以下のようなプログラムを組んでみました。 -------------------------------------------------- #pragma warning( disable : 4786 ) #include <vector> #include <iostream> using namespace std; void EditYMatrix(vector< vector< vector<int> > > *vi, int i); void EditSquareMatrix(vector< vector<int> > *vi, int i); int main(int argc, char* argv[]) { int i, j, c; vector< vector< vector< vector<int> > > > vi; cout << "Xの要素数を入力してください" << endl; cin >> c; vi.resize(c); cout << "Yの要素数を入力してください" << endl; cin >> c; for(i=0 ; i<vi.size() ; i++) EditYMatrix(&vi[i], c); cout << "Zとωの入力" << endl; for(i=0; i<vi.size() ; i++){ for(j=0; j<vi[i].size() ; j++){ cout << i << "," << j << "番目の自由度を入力してください" << endl; cin >> c; EditSquareMatrix(&vi[i][j], c); } } return 0; } void EditYMatrix(vector< vector< vector<int> > > *vi, int i) { vi->resize(i); } void EditSquareMatrix(vector< vector<int> > *vi, int i) { vi->resize(i); for(int j=0; j<i ; j++) vi[j].resize(i); } -------------------------------------------------- Y,Z,ωは可変で、Zとωは同じにするので、 ためしにこのようなプログラムを組んでみました。 ですが、実行途中でエラーが起きてしまいます。 /* verify block type */ _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); という部分でエラーが起きているのですが 知識不足で、どのような内容なのかわかりません。 どなたか分かる方教えてください。 OS:Win2000 VC++6.0

  • CygwinでSTLの勉強をしていますが・・・

    今C++のSTLの勉強をしています。 本に載っているサンプルプログラムを打って実行しようとしたら エラーがでてしまいました。 エラーの内容はprintとtotalが見つかりませんというエラーです。 コンパイラはcygwinを使ってます。 よろしくお願いします。 /*for_each()アルゴリズム*/ #include<iostream> #include<algorithm> #include<vector> #include<functional> #include<> using namespace std; int main() { int n[]={100,200,300,400,500,600}; int size=sizeof n/sizeof(int),i; vector<int> v; for(i=0;i<size;++i) v.push_back(n[i]); for_each(v.begin(),v.end(),print<int>()); cout<<endl; cout<<(for_each(v.begin(),v.end(),total<int>())).gettotal()<<endl; return 0; }

  • VectorなどSTL?テンプレートの使い方

    戻り値がポインタの場合、関数から抜け出すと値の保証が無いので、それを使用する場合は、変数にコピーして使うと値は残る(アクセス可能)と理解しています。 char tmp[128]; strcpy(tmp, test()); それで、次のような vector??を使った場合、表示の場合は問題ないかもしれませんが、その後、値を使い続ける場合、ポインタのままでよいのか疑問に思っています。 以下のソースは勝手気ままに記述したものですが、 VC++6でエラーなく動作(とりあえず動く)しているのですが、今後発生する問題など知りたいです。 #include "stdafx.h" #include <string> #include <iostream> #include <vector> #include <sstream> using namespace std; class A { string str; vector<A *> v_cls; public: A(){ } // デフォルトコンストラクタが必要? A(string s){ str = s; } void PrintData(void){ // 表示 cout << str << endl; } // 1から9までの[0]-[9]の文字列を作成 vector<A *> ArraySet(void){ stringstream ss; for (int i=0; i < 10; i++){ ss.str(""); ss << "function [" << i << "]\n"; v_cls.push_back( new A( ss.str() ) ); } return v_cls; } }; void main(void){ // 1から9までの[0]-[9]の文字列を作成 // これは問題ないと思う vector<A *> v; stringstream ss; for (int i=0; i < 10; i++){ ss.str(""); ss << "[" << i << "]\n"; v.push_back( new A( ss.str() ) ); } v[1]->PrintData(); v[3]->PrintData(); ////cout << v.size(); // クラス自身にvector配列?を返す処理 // とりあえず動いているだけ??? A x; vector<A *> ret = x.ArraySet(); // このような代入でも問題ないのでしょうか? ret[5]->PrintData(); // 表示だけなので、問題なし? ret[0]->PrintData(); // vやret, xの解放仕方とタイミングはどうすればよいのでしょうか? }