• ベストアンサー

関数の戻り値なんですが...

VC++を使用し以下のような関数additionで文字列を返したいのですが アドレスしか返しません。配列はその先頭のポインタだということは しっているのですが.... additionは、二つの文字列(32や47などの数字のやつ)を引数とし、そ れを整数型に変換し、その加算を行い、その結果を文字列型に変換し 、その文字列をかえす関数です。 関数の定義などが間違っているのですか?? #include<iostream.h> #include<string.h> #include<string> char *addition(char *,char *); void main(){ using namespace std; char a[] = "1000"; char b[] = "456"; cout << addition(a,b) << '\n'; } char *addition(char *a,char *b){ int c = 0; c = atoi(a)+atoi(b); char p[20]; _itoa(c,p,10); cout << p <<'\n'; return (*p); }

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

  • ベストアンサー
回答No.1

std::string を返してはいかがでしょうか。 #include <iostream> // std::cout #include <string> // std::string #include <cstdlib> // std::atoi, _itoa std::string addition(const char* a, const char* b) { int result = std::atoi(a) + std::atoi(b); char buffer[20]; return _itoa(result, buffer, 10); } int main() { std::cout << addition("1000","456") << std::endl; return 0; }

enmaru
質問者

お礼

ありがとうございました。「atoiがstdクラスではない」というエラーがでますが、できました。

その他の回答 (2)

回答No.3

N02です すいません間違えました。。。 return (*p); では文字列pの先頭の文字だけ返します。 つまりこれはchar型です。 しかし、関数の返値はchar*型です。 コンパイル時にエラーは起きなかったのでしょうか?

enmaru
質問者

お礼

まいどありがとうございました。ひともじだけかえすのはわたくしもやってしまいました

enmaru
質問者

補足

エラーはでなかったのですが、「これはローカル変数のあどれすを返します」という警告がでました

回答No.2

プログラムの動作自体はさておき。。。 char *addition(char *a,char *b) { int c = 0; c = atoi(a)+atoi(b); char p[20]; _itoa(c,p,10); cout << p <<'\n'; // ここで、この関数のローカル変数であるpのアドレスを返しています。これは致命的なエラーを引き起こす可能性があります。 return (*p); } ローカル変数のアドレスを返しても全く意味がありません。 なぜなら、ローカル変数はその関数の終了時に破棄されるからです。 つまり、この変数を使用することは初期化されていない変数を参照するのと同じことです。 当然、意味のないアドレスが取得でき、文字列は取得できません。

関連するQ&A