- ベストアンサー
関数の戻り値なんですが...
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); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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; }
その他の回答 (2)
- winterofmeei
- ベストアンサー率22% (20/88)
N02です すいません間違えました。。。 return (*p); では文字列pの先頭の文字だけ返します。 つまりこれはchar型です。 しかし、関数の返値はchar*型です。 コンパイル時にエラーは起きなかったのでしょうか?
お礼
まいどありがとうございました。ひともじだけかえすのはわたくしもやってしまいました
補足
エラーはでなかったのですが、「これはローカル変数のあどれすを返します」という警告がでました
- winterofmeei
- ベストアンサー率22% (20/88)
プログラムの動作自体はさておき。。。 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); } ローカル変数のアドレスを返しても全く意味がありません。 なぜなら、ローカル変数はその関数の終了時に破棄されるからです。 つまり、この変数を使用することは初期化されていない変数を参照するのと同じことです。 当然、意味のないアドレスが取得でき、文字列は取得できません。
お礼
ありがとうございました。「atoiがstdクラスではない」というエラーがでますが、できました。