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

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

関連記事

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

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

Valgrindで行番号を表示させる方法

  <目次> (1) Valgrindで行番号を表示させる方法  (1-1) 行番号を表示させる方法  (1-2) (参考)「-g」オプションについて (1) Valgrindで行番号を表示 …

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

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

C++のfork関数の構文や使い方について

  <目次> (1) C++のfork関数の構文や使い方について  (1-1) fork()関数とは?概要や目的  (1-2) fork()関数の構文  (1-3) fork()関数のサンプ …

C++のunsigned char型とは?概要やsigned charとの違いもご紹介

<目次> (1) C++のunsigned char型とは?概要やsigned charとの違いもご紹介  (1-1) 概要  (1-2) サンプルプログラム①:疎通確認 (1) C++のunsign …

  • English (United States)
  • 日本語
Top