• 締切済み

char*の実体の数値をchar変数に格納する方法

ある関数の戻り値がchar*でその関数の戻り値をchar変数に格納したいです。 char *ret_ch() { char *p="12"; return p; } int main(){ char res; //ここでret_ch()の戻り値の実体数値を代入 res=*ret_ch(); cout<<"RET=="<<ret<<endl; return 0; } char型は1バイトなので一文字しか入りません。 char型に数値として扱い、上記のポインターの 実体数値を格納するにはどのようにしたらいいのでしょうか? よろしくお願い致します。

みんなの回答

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

>もし、戻り値がint型でその値をcharに格納する場合は、どのようにしたらいいのでしょうか? >res_ch=(char)ret_int(); 数値として代入したいのなら上記でイイと思います。 ですが、当然charには127以上の数値を(正しく)代入できません。 C文字列として変換したいのであれば #include <cstdio> char buff[5];//必要な桁+1 sprintf(buff,"%d", ret_int()); cout<<buff<<endl; とかすればいいと思います。

noname#112947
noname#112947
回答No.3

// strtolのライブラリのusing // iostreamのusing char* twelve = "12"; char* ret_ch() { return tewlve; } void main() { char* r = ret_ch(); char* p; int n = strtol(r, &p, 10); count << "RET" << n << endl; }

  • PG_RankB
  • ベストアンサー率40% (12/30)
回答No.2

・・・日本語が今ひとつはっきりしないのですが、ret_ch()の中で作った"12"を、整数としての12にして、char型の変数に返したいと言う事でしょうか? そうならば、文字列の"12"を、自力で数値に変換するか、atoi()などの標準関数を使用するかしないといけないと思います。 "12"は、文字列です。(内部的には数値ですがここでは気にしない事) "12"の先頭アドレスを返しているのですから、 res=*ret_ch()とした場合、"12"のアドレスの0番目の一文字を、resに格納する。 という意味になるので、当然1と出力されます。 スタンダードにやるなら、BLUEPIXY様の仰る通り、 char res; //ここでret_ch()の戻り値の実体数値を代入 res=atoi(ret_ch());//数値として代入 とすれば丸く収まるはずです。 char resを char *resとして、 res = ret_ch()とすれば、resのポインタを進めてその先を表示する事も出来ますが・・・

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

もう一つやりたいことが良く判らないので勘違いしてたらすみません。 C文字列から数値にするには、atoiとかstrtolとかを使えばいいです。 charですべての文字を受けるには、配列などにしてstrcpyすればいいと思います。 --------------------------------------------------------------- #include <iostream> #include <cstdlib> using namespace std; char *ret_ch(){ char *p="12"; return p; } int main(){ char res; //ここでret_ch()の戻り値の実体数値を代入 res=atoi(ret_ch());//数値として代入 cout<<"RET=="<<(int)res<<endl; char *ret=ret_ch(); cout<<"RET=="<<ret<<endl;//ポインタとして受けて文字列として表示 char buff[3]; strcpy(buff,ret_ch()); cout<<"RET=="<<buff<<endl; return 0; }

the-ai
質問者

補足

追加ですが、 もし、戻り値がint型でその値をcharに格納する場合は、どのようにしたらいいのでしょうか? int ret_int(){ int res =2005; return res } int main(){ char res_ch; //ここでchar型の変数に格納するが?? res_ch=(char)ret_int(); cout<<res_ch<<endl; return 0; } よろしくお願い致します。

関連するQ&A

  • 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; } お手数をお掛けしますが、 よろしくお願い致します。

  • char型変数のアドレスを coutで表示するには

    #include <iostream> using namespace std; int main() { bool b; int i; short s; long l; float f; double d; char c; //上で宣言した変数のアドレスを表示 cout << "bool &b " << &b << endl; cout << "int &i " << &i << endl; cout << "short &s " << &s << endl; cout << "long &l " << &l << endl; cout << "float &f " << &f << endl; cout << "double &d " << &d << endl; cout << "char &c " << &c << endl; //「char &c 」とのみ表示される cout << '\n'; //char型のみ printf で再表示 printf("char &c %p\n", &c); //「char &c ********」と表示される return 0; } 上のプログラムを実行すると cout << "char &c " << &c << endl; のところだけ、アドレスが表示されません。 printfを使えば、char型の変数のアドレスも表示されるのですが…。 coutを使ってchar型のアドレスを表示させるにはどうすればいいのでしょうか。 よろしくお願いします。

  • 下記、プログラム内の「char *」の役割

    C++初心者です。 縦長になってしまいますが、 『 #include <iostream.h> void show(int); void show(double); void show(char *);   ←左記の記述の使い方 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char *z) { cout << z << endl; } 』 のプログラムにおいて、「char *」の使い方がいまいち理解できません。 上記プログラムですとエラーが表示されないのですが、下記のプログラムだとエラーが発生します。 『 #include <iostream.h> void show(int); void show(double); void show(char);   //←---------上記と違う行 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char z) {  //←---------上記と違う行 cout << z << endl; } 』 なぜ、ポインタ(*)を付けないといけないのか分かりやすく教えていただけましょうか。

  • STLについて

    VC++6を使っています。ベクタを戻り値とするプログラムを書いています。効率が悪く感じるのですが、STL?ではこういうやり方は正しいのでしょうか? また、一般的にSTLで引数や戻り値を扱う場合、どのようなタイプ(string?)を使えば、効率よく、きれいなプログラムが書けるのでしょうか? class A{ ... } vector<A> test(void){ vector<A> ret; for (int i = 0; i < 1000; i++){ ret.push_back( A(i) ); } return ret; } vector<A> a = test(); // 巨大なコンテナが返され、aにコピーされる? ※基本的に戻り値の仕組みが理解不足です。 char *の場合は、char配列のポインタが返され、新たな変数にポインタ値がコピーされるという解釈で結構ですか? char * sample(void){ char *p = new [1000]; return p; } char *q = sample();

  • forkの失敗???

    C++(UNIX)です。 以下のようなprogramをくみました。 comは自作のCシェルです。 ------------------- : pid_t ch_pid = fork(); cout << "ch_pid = " << ch_pid<< endl; int shell_ret = 0; int execl_ret = 0; int status = 0; if( ch_pid == 0) { cout << "execl(shell)" << endl; execl_ret = execl(com, com, NULL); cout << "execl ret = " << execl_ret << endl; } else if(ch_pid < 0) { cout << "fail to fork" << endl; cout << "errno = " << errno << endl; return 0; } waitpid(ch_pid, &shell_ret, 0); : ------------------ 実行したところ、 成功する[シェルが実行される]場合と、失敗する[シェルが実行されない]場合があります。 シェルが失敗するときはそれ以上先に進まず、固まってしまいます。(waitpidのせいだと思いますが。) 成功する場合のログ --------------- ch_pid = 12885 ch_pid = 0 execl(shell) : --------------- 失敗する場合のログ --------------- ch_pid = 12885 : --------------- forkに失敗していたら、"fail to fork"と表示されると思うので forkには失敗していないと思うのですが・・・。 なぜ、execlは実行されないのでしょうか。

  • char型配列について

    基本的なことですが、 char str[5]="Hello"; --> str[0]='H' str[1]='e' str[2]='l' str[3]='l' str[4]='o' str[5]='\0' では、ないのでしょうか? エラーが出ます。 //error C2117: 'str' : 指定された配列には、初期化子が多すぎます。 char str[6]="Hello"; では、コンパイルできます。 ---------------------------------- また、 #include<iostream> using namespace std; int main() { char str[6]="Hello"; cout << str << endl; for(int i=0;i<7;i++) { cout << "i=" << str[i]; if(str[i]=='\0'){cout << " NULL" << endl;} else{cout << endl;} } getchar();return 0; } ----------------------------------------------- とすると、 Hello i=H i=e i=l i=l i=o i= NULL <--ここで、NULLなら、 i=フ <--このぶんは、いらないと思うのですが、、、 となります。 str[6] i=6 は、何を意味するのでしょうか? Visual C++ NET を使用しています。 よろしくお願いします。

  • char *の書き換え

    #include <iostream.h> int main(){  char *p = "abcdef";  p[3] = 'g';  cout << p[3];  return 0; } C++です。 p[3] = 'g'; は、やってはいけないことですか?

  • オブジェクトのポインタ

    #include<iostream> using namespace std; class letters{ char ch; public: letters(char c){ch=c;} char get_ch(){return ch;} }; int main(){ letters ob(A) cout<<ob.get_ch(); return 0; } なんですが cout<<ob.get_ch(); を cout<<&ob->get_ch(); には何故できないのですか? これならコンパイルできるのですが、 letters *p; p=&ob; cout<<p->get_ch(); コンパイラはVisual Studio 2008です よろしくお願いします。

  • CHAR型ポインタについて。

    CHAR型ポインタについて。 当方C言語初心者です。 ポインタと文字列の関係分からないことが出てきました。 参考にしている本があり、そのページに下記のソースで「const char *pc1」のポインタ変数を用意して、そこに直接文字列を代入しています。 本来、「char *pc1」はchar型のアドレスを格納するための変数のはずなのに、その変数に文字列を代入してることに疑問を感じました。 この記述の仕方は間違っていないのでしょうか?また、アドレスを格納するための変数「*pc1」に「abcdefg」の文字列はどのようにメモリ上で格納されているのでしょうか? 知ってどうなるの?みたいな質問かもしれませんが、ご教授いただけると幸いです。 #include <stdlib.h> #include <string.h> void func(void) { const char *pc1 = "abcdefg"; //←ココ char *pc2 = (char *)malloc( strlen(pc1) +1); if ( pc2 ) { strcpy( pc2, pc1 ); free( pc2 ); } }

  • char型ポインタ

    よくプログラムで charポインタだけ指定して、 #include<stdio.h> int main(){ char* p; p = "abcdef"; printf("%s",p); return 0; } のようにしているのをみかけますが、 メモリーを確保していなくても問題ないのでしょうか? char* p; p = (char*)malloc(7); strcpy(p,"abcdef"); としたのと同じでしょうか?

専門家に質問してみよう