Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an lvalue of type ‘const char [x]’」が発生した時の原因と対処

投稿日:2022年1月20日 更新日:

<目次>

(1) C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an lvalue of type ‘const char [x]’」が発生した時の原因と対処
 (1-1) エラーメッセージ&発生状況
 (1-2) 原因
 (1-3) 対策

(1) C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an lvalue of type ‘const char [x]’」が発生した時の原因と対処

(1-1) エラーメッセージ&発生状況

(エラーメッセージ)

error: cannot initialize a variable of type 'const unsigned char' with an lvalue of type 'const char [2]'
 
あくまで発生する一例ですが、「unsigned char uc = “a”;」のように「unsigned char」型の変数に文字列を割り当てたプログラムをコンパイルした際に発生します。

#include <iostream>
using namespace std;

string test(unsigned char uc){
    string str(1, static_cast<char>(uc));
    return str;
}
int main(void){
    unsigned char uc = "a";
    cout << test(uc) << endl;
}
(図111)

目次にもどる

(1-2) 原因

「const unsigned char」型の変数を、「”a”」(const char [4])で初期化できないため、エラーになっています。

C++では文字列リテラル(値を直接プログラムに書いたもの)は、「const char」型の「配列」になります。この配列の大きさは「文字の数+1」になります。「+1」する理由は、文字列の最後にヌル文字(文字列の終端を意味する値)が入るためです。
 
(例)
・文字列リテラル「”123″」は「const char[4]」の型
・文字列リテラル「”a”」なら「const char[2]」の型
 
一方で、代入しようとしている変数は「unsigned char」型のため、型がマッチせずにエラーとなっています。

(1-3) 対策

あくまで、代入される変数が「unsigned char」の例にはなりますが、「unsigned char」は「単一の文字」か「数値」を受け付けるため、それらの値を代入するようにします。
(OK例1)
#include <iostream>
using namespace std;

string test(unsigned char uc){
    string str(1, static_cast<char>(uc));
    return str;
}
int main(void){
    //# 修正箇所
    unsigned char uc = 65;
    cout << test(uc) << endl;
}
 
(図131)

(OK例2)

#include <iostream>
using namespace std;

string test(unsigned char uc){
    string str(1, static_cast<char>(uc));
    return str;
}
int main(void){
    //# 修正箇所
    unsigned char uc = ‘a’;
    cout << test(uc) << endl;
}

(図132)

●(参考)”a”と‘a’の違い

C++ではシングルクォート「’a’」は単一の文字(単一も文字リテラル)を表しています。一方で、ダブルクォート「”a”」はstringリテラルを表しており、「’a’」とヌル文字(\0)の2文字の配列を表しています。なので、似て非なるものなのです。

「’a’」=a
「”a”」=a\0
 

●(参考)unsigned char⇒stringへの変換

「unsigned char型」⇒「string型」への変換は次のように変換します。
(構文)
string (size_t n, char c);
(例)「unsigned char」を「string_cast<char>」でcharにキャストし、stringのコンストラクタを使って、string型に変換しています。
string str(1, static_cast(uc));

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Valgrindとは?使い方や概要をご紹介(メモリリーク検知ツール)

  <目次> (1) Valgrindとは?使い方や概要をご紹介(メモリリーク検知ツール)  (1-1) Valgrindとは?  (1-2) Valgrindの導入方法  (1-3) Va …

C++のマルチスレッド処理のサンプルや概要について

  <目次> (1) C++のマルチスレッド処理のサンプルや概要について  (1-1) C++のマルチスレッドの概要  (1-2) 構文1:関数ポインタ式  (1-3) 構文1(例):関数ポ …

C++のtime関数やtime_t型の使い方について

  <目次> (1) C++のtime関数やtime_t型の使い方について  (1-1) C++のtime関数とtime_t型とは?  (1-2) C++のtime_t関数のサンプル (1) …

パイプ通信とは?概要やサンプルプログラムをご紹介

  <目次> (1) パイプ通信とは?概要やサンプルプログラムをご紹介  (1-1) パイプ通信の概要  (1-2) パイプ通信の構文  (1-3) パイプ通信のサンプルプログラム①(単一プ …

Valgrindの使い方や見方について(基礎編)

  <目次> (1) Valgrindの使い方や見方について(基礎編)  (1-1) メモリリークのチェックのやり方  (1-2) 「valgrind」コマンドの基本的な使い方  (1-3) …

  • English (United States)
  • 日本語
Top