• ベストアンサー

string型からint型への型変換

C++で、string型からint型は、 string str; //ほかのstring型の変数から整数部分のみを切り出して来たものが入る int i; //ここにstrの中身(整数)をあらたに入れたい が定義されている下で、 char s[10]="0"; などを通して、 int length=str.length(); str.copy(s,length,0); i=atoi(s); とやる他ないのでしょうか? 初心者のつまらない質問ですが、ご教授いただけると幸です。 よろしくお願いします。

noname#9431
noname#9431

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

#include <string.h> #include <strstream.h> int main(void){ string str("1234"); istrstream istr(str.data()); int i; istr >>i; cout << i << '\n'; return(0); } strstreamを使うことで、 cin >> i; と同じように変数に代入できます。

noname#9431
質問者

お礼

ご回答ありがとうございます。 質問が言葉たらずだったのですが、 質問の動機は、atoiを使うと、なんだかC++にCを継ぎ足したようで嫌だなあ、 もっと、C++らしい書き方ができないものか?ということでした。 ストリームを使うとC++らしく書けているような気がしますね! (素人の勝手な感覚かも知れませんが。) strstreamを使えば型変換して代入できるという点、とても参考になりました。 有難う御座いました。

その他の回答 (3)

  • keyguy
  • ベストアンサー率28% (135/469)
回答No.4

str.c_str(): // basic_stringの'\0'で終わる文字列本体へのポインタを返します。 const charT* c_str() const; str.data(): // 文字列データ本体をそのまま返す。 // '\0'が文字列の終わりにあるという保証はたぶんありません。 const charT* data() const; str.data()は char* と同じように扱えないかもしれないので char* とまったく同じ str.c_str() を使うほうがC言語になれている人にはいいでしょう また<~.h>は旧式のものなので.hなしのもののほうがいいでしょう

noname#9431
質問者

お礼

ご解説ありがとう御座います。 Cは文字列処理がハッキリ言ってダメダメなので(もちろん、慣れの問題もあるのでしょうが。)C++を使い始めました。 そんなに大きなプログラムを組むわけでもないのでC++で組む必要もないのですが、 C++のその枠組みというか思想というか、言語設計っていうんでしょうか、 まあそいったものに関心し、少くとも、C++らしいコードを書きたいものだと思っております。 でも、CからC++に行くと、C++の言葉を使った単なるCのようなダサいコードになってしまうというのが悩みだったりしまして。 まあ、Cもたいして使えないのですが。。。

  • keyguy
  • ベストアンサー率28% (135/469)
回答No.3

難解な質問を読んでないので勘違いしているかも #include<iostream> #include<string> using namespace std; void main(void) { string str; int i; str="9"; i=atoi(str.c_str()); cout<<i<<endl; }

noname#9431
質問者

お礼

ご回答ありがとうございます。#1のお礼の欄にも書かせて頂いた通り、 質問の動機は、atoiを使うと、なんだかC++にCを継ぎ足したようで嫌だなあ、 もっと、C++らしい書き方ができないものか?ということでした。 質問が言葉たらずでした。申し訳け有りません。 でも、 i=atoi(str.c_str()); は、すくなくともCとC++を正当につなげ、しかも私が質問欄にかいた コードよりはるかにスッキリしてますね。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

補足ですが、 i=atoi(str.data()); でいいです。

noname#9431
質問者

お礼

再び有難うございます。 この書き方は、#4のkeyguyさんの意見に基づくと、ちょっと心配ですね。 でも、参考になりました。

関連するQ&A

  • string から unsigned char へ

    unsigned char* uchar_string(string* str) { int length = str->length(); const char* cchar = str->c_str(); unsigned char* uchar = new unsigned char[length+1]; for(int i=0; i=length; i++) { uchar[i] = (unsigned char)cchar[i]; } return uchar; } int main() { string str; cin >> str; unsigned char* uc; uc = uchar_string(&str); cout << uc; delete uctest; return 0; } このようにしたところ、cout << uc; が出力されず入力待ちとなり正常に動きませんでした。 原因がわからないです。原因と解決方法のご教授願います。

  • int型変数をchar型変数に格納する方法

    int型数値をchar型変数に格納したいのですが、 sprintf()とatoi()を用いてやりましたが、 うまくいきません。 考えたコードを下記します。 int get_y(){ int y=2005; return y; } int main(){ char year; char str[5]; //intをcharに変換して格納している sprintf(str,"%d",get_y()); //数値として代入 year=atoi(str); //yearには2005が格納されていない! cout<<year<<endl; char ans; //このchar型変数に数値を代入する。 ans=year; cout<<ans<<endl; return 0; } お手数をお掛けしますが、 よろしくお願い致します。

  • mallocがうまく動かない

    コマンドライン引数で指定された文字列を逆順に返すプログラムを作るため 下記のようなプログラムを組みました。 ところが変数strの大きさがargv[1]より大きくなってしまいます。 どうすればよいのでしょうか。 #include <stdio.h> #include <stdlib.h> char *mstrrev (char *s); int main(int argc, char *argv[]){ char *str; str = mstrrev(*(argv+1)); printf("%s",str); free(str); } char *mstrrev (char *s){ int length,i; char *str; for(length=0;*(s+length)!='\0';length++); str = (char *)malloc(sizeof(char)*length); for(i=0;i<length;i++){ str[i] = s[length-1-i]; } return str; }

  • String型とchar型の変換エラーです

    今晩は!またまたこの掲示板にきました。よろしくお願いします。 文字列かブランクを取り出すコードを書きましたが、 -------- char ch_check = str.charAt(i+1) ; if(ch_check ==" ") { --------- のところでString型とchar型の混合は受け入れられませんのようなエラーが出ました。 if(ch_check ==" "をboolean型でうけるのも拒否されました。 どこをどのようにしてやればよいでしょうか。 JAVA初心者です、特に文字列の取り扱いは評判通りわかり難くくないています。 よろしくお願いします。 ---------- public class Mojiretu_Blank { public static void main(String[] args) { String str = "This is a pen."; int i = 1 ; int blank_count = 0 ; while( i < (str.length()+1) ) { char ch_check = str.charAt(i+1) ; if(ch_check ==" ") { blank_count ++ ; System.out.println(ch_check); } else{} System.out.print("ブランクの数は" + blank_count + "個です。"); } } }

    • ベストアンサー
    • Java
  • String文字列を16進数のint型に変換

    String^ test = Wireless_ID_str02[i]->s_rssi; このtestには"1c"という文字列が入っているのですが、この文字をint型の int rssi_dec = ****** この中に入れたいのですが、方法はないでしょうか? ちなみに、 rssi_dec = strtol(test, &endptr, 16); こんなことをやってみたのですが、こんなエラーがでました。 error C2664: 'strtol' : 1 番目の引数を 'System::String ^' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 使用可能なユーザー定義された変換演算子がない、または 1> マネージ型をアンマネージ型に変換できません。 どうぞ、よろしくお願い致します。

  • charで宣言した変数をstringへの代入で

    wchar_t cOrg[128]と宣言している変数にstringで宣言しているstrを cOrg[i] = str[i]; このように代入することはできたのですが、 char cAns[ 128 ]; このように宣言した変数の値をstrの41番目と42番目に 次のように入れようとするとエラーが出ます。 str[41]=cAns[1]; str[42]=cAns[2]; (エラー内容) \Form1.h(428): error C2664: 'System::String::String(wchar_t,int)' : 1 番目の引数を 'wchar_t [128]' から 'wchar_t' に変換できません。(新しい機能 ; ヘルプを参照) このような代入はできないのでしょうか? プログラムの詳細は下のようなものです。 wchar_t cOrg[128],*p; String^ str; String^ str2; int i; int iVal1,iVal2,iTotal = 0,iHosu; char cAns[ 128 ]; str = this->textBox1->Text; for(i=0;i<41;i++) { cOrg[i] = str[i]; } -------(中略)------------------------------------------ iHosu = ~iTotal; // 1の補数 iHosu++; // +1 iHosu = iHosu & 0x00FF; sprintf( cAns, "%s%02X%c", cOrg, iHosu, 0x22 ); str[41]=cAns[1]; str[42]=cAns[2];

  • int → char → string の変換

    お世話になります。 現在 VisualStudio2005 C# のコンソールアプリを作っています。 以下の場合どのようにすれば解決しますでしょうか? int code = 0xF97E; // この値をF97Eという文字(外字)にしたい 以下のように記述してみましたが、駄目でした。 int hex1 = ((code & 0xff00) >> 8); // (hex1==0xF9)になる int hex2 = (code & 0x00ff); // (hex2==0x7E)になる string s = char.ToString((char)hex1) + char.ToString((char)hex2 )); // (s==u~==0x757E)になってしまう。 原因がわかる方いらっしゃれば教えてください。

  • C言語のint型の配列が分かりません

    #include<stdio.h> int main(void) { int str[ ]={0,1,2} printf("%s\n", str); return 0; } というプログラムをC言語でつくってみましたが動きません.(012と表示されて欲しかったのですが) int str[ ]={1,2,3}の部分をchar str[ ]={'0','1','2'}とすれば動きます. そこで質問なのですが, printf("~%s~", (配列名));  はchar型の配列にしか適応できないのですか? ※追記 puts関数の定義は int puts (const char *str); であるそうなので char型の仮引数にはchar型のアドレスを渡さなければいけません. ではprintf関数の定義は一体どんなものなのですか?

  • intやshortやcharの変数確保時間

    for文などでよく一時変数に for ( int i=0; ・・・ とか for ( short s=0; ・・・ とか for ( char i=0; ・・・ みたいに整数型の変数が使われます。 確か変数の表せる範囲は long>int>short>char だったと思うのですが、変数を確保する時間やメモリサイズに違いはあるのでしょうか? たとえばlong型変数を10万個確保する時間とintとかshortとかcharのそれ とは違いがあるのかなぁと疑問に思いました。

  • JSP内でString型からint型に変換する方法(SAStruts使用)

    現在、SAStrutsを使用して、カレンダーの年表を作成しています。 Formクラスで定義したString型の変数を、JSP内でint型に変換するのが、うまくいきません。 申し訳ございませんが、ご教授いただけませんでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Java