質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2113閲覧

returnで変数を返す

takataka0324

総合スコア2

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/08/05 01:48

やりたいこと

10進数を16進数に変換するプログラムを作っていたのですが、returnで変数を返すことができません。
どこが問題なのでしょうか。

エラーメッセージ test.cpp:38:12: error: cannot initialize return object of type 'int' with an lvalue of type 'unsigned char *' return str_ptr; ^~~~~~~ 1 error generated.

C++

1ソースコード 2inline int Hex(unsigned int i) 3{ 4 unsigned char buf[1024]=""; 5 unsigned char * str_ptr=&buf[sizeof(buf)-1]; 6 while(i) 7 { 8 *--str_ptr=i%16; 9 if(10>*str_ptr) 10 { 11 *str_ptr+=0x30;//0x30は0の文字コード 12 } 13 else 14 { 15 *str_ptr+=(0x41-0x0A);//0x41はAの文字コード 16 } 17 i/=16; 18 } 19 printf("%s\n",str_ptr); 20 return str_ptr; 21}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

返す値の型の不一致です。
関数Hexint型の値を返すと定義されているのに、返している値str_ptrの型はunsigned char *です。
関数Hexは文字列を返したいのではないですか?
それなら関数Hexの戻り値は、たとえばunsigned char *でなければなりません。
しかし、そう修正しても、なおこのコードには問題があります。
単純にstr_ptrを返してはいけません。
その理由は別途考えてください。

投稿2021/08/05 01:53

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

10進数を16進数に変換するプログラムを作っていたのですが、

unsigned int i の i は、4バイト 32ビットの値で、10進数ではありません。
32ビットの各ビットは、'0' や '1' といった文字表現ではありませんが、
メモリ内部で 0 と 1 を表す内部2進表現です。

unsigned int の値を 16進文字列にしたいということだったら、
最大8文字で文字列としては終端の '\0' を含めて 9バイトの char配列が必要です。

しかし、関数は配列を返せません。
C++ には string という型があるので、それを返せばよいでしょう。

C++

1#include <iostream> // cout, endl 2#include <cstdio> // sprintf 3#include <string> 4using namespace std; 5 6string Hex(unsigned int i) 7{ 8 char s[9]; 9 sprintf(s, "%08X", i); 10 return string(s); // return s; と書いても string のコンストラクタにより型変換される 11} 12 13int main() { cout << Hex(1000000) << endl; }

先行する 0 が不要なら、sprintf の書式を "%X" にしてください。

投稿2021/08/05 06:29

編集2021/08/06 00:58
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

16進文字列に変換したいのかな?

C++

1#include <sstream> 2#include <iomanip> 3#include <string> 4 5template<typename T> 6std::string Hex(T val) { 7 std::ostringstream stream; 8 stream << std::hex << std::uppercase 9 << std::setfill('0') << std::setw(sizeof(T)*2) << val; 10 return stream.str(); 11} 12 13// おためし 14#include <iostream> 15int main() { 16 unsigned int x = 0xCAFEBABE; 17 std::cout << "[" << Hex(x) << "]\n"; 18}

投稿2021/08/05 02:15

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問