こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Stringからconst char配列への代入

ランダムな文字列が書かれているtestPrivate.key というファイルがあります。

(ファイル内容)
-----BEGIN TEST PRIVATE KEY-----
MIIEpAIBAAKCAQEAxjvazMLAylmhH4+9HI0Gbb7WuQAaEVo4VofQQ0T2mshmbXfV
xwBb0SeSEm7B38rRgJGCiZtaKI0dzlykdQU04MN2iHQpEd5TWqnWMzqS+reUZhmF
(中略)
yC/KZMqqr/b1TnbMzQvN/d6G3BXYlb8VOhF88xVY9NhhvcaBv7zLF0+PlC7O1CnM
ckqLSKa+yrI85HfkO7mXjWwDecPcNbl8F9hKkYLztQHaafB3ej2jUA==
-----END TEST PRIVATE KEY-----

この文字列を
const char* Client_private;

この配列に代入するにはどのようにすれば良いでしょうか?





現在次の様なプログラム関数を作った時に、

bool testPrivateKey(fs::FS &fs, String path) {
//File file = SD_MMC.open(path, "r");
File file = fs.open(path, "r");

if (!file) {
Serial.printf("Can't Open File %s", path);
return false;
}
String keygenComplete;
String keygen;
while (file.available()) {
String line = file.readStringUntil('\n');
line = line.substring(0, line.indexOf('---'));
keygen = line.substring(0, line.indexOf('\n'));
keygen.trim();
keygenComplete += keygen;

}
Client_private = keygen.c_str();
Serial.printf("data check: %s\n", Client_private);
//Serial.printf("data check: %s\n", keygenComplete.c_str());
return true;
}


この関数を
testPrivateKey(SD, "/private.pem.key");
これで呼び出した時のシリアルモニタの結果は

data check:

このような感じでkeygenCompleteで貯めたはずの文字列が表示されませんでした。


なお、 関数内でコメントアウトしている
Serial.printf("data check: %s\n", keygenComplete.c_str());

これを戻して
testPrivateKey(SD, "/private.pem.key");を実行した場合は、

data check: MIIEpAIBAAKCAQEAxjvazMLAylmhH4+9HI0Gbb7WuQAaEVo4VofQQ0T2mshmbXfVxwBb0SeSEm7B38rRgJGCiZtaKI0dzlykdQU04MN2iHQpEd5TWqnWMzqS+reUZhmFYFFaX/gDh4ECs7j1f6DpRtO
(中略)
rI85HfkO7mXjWwDecPcNbl8F9hKkYLztQHaafB3ej2jUA==

このファイルの文字列が出てくるので、”keygenComplete”には文字列は入っていることは確認できました。

適切な代入方法など、ご教示の程よろしくお願い致します。

投稿日時 - 2019-02-04 17:11:18

QNo.9584630

すぐに回答ほしいです

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

> Client_private = keygen.c_str();

keygenCompleteじゃなくてkeygenを使っているからでは?

投稿日時 - 2019-02-05 10:10:17

お礼

回答頂きありがとうございます。
いろいろとプログラムのチェックをやっていなくてミスが多いことに気づきました。
とりあえず1つ1つprintfで、格納された文字列などを確認しながら、修正して行ったところ、次のようなプログラムで、やりたかった処理ができるようになりました。
助かります。





const char* Client_private;

bool awsPrivateKey(fs::FS &fs, String path) {
//File file = SD_MMC.open(path, "r");
File file = fs.open(path, "r");

if (!file) {
Serial.printf("Can't Open File %s", path);
return false;
}
String keygenComplete;
String keygen;
while (file.available()) {
keygen = file.readStringUntil('\n');
keygenComplete += keygen + "\n";
}

Client_private = keygenComplete.c_str();

Serial.printf("data check: %s\n", Client_private);
//Serial.printf("data check: %s\n", keygenComplete.c_str());
return true;
}

投稿日時 - 2019-02-06 07:00:46

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>const char* Client_private;
この配列に代入するにはどのようにすれば良いでしょうか?

const char*は配列ではなくポインタです。

>Client_private = keygen.c_str();
これを実行したとき、keygenは内容は
>keygen = line.substring(0, line.indexOf('\n'));
>keygen.trim();
を最後に実行したときの内容に置き換わっているので取り込んだ最後の行の内容ですよ。

投稿日時 - 2019-02-05 19:41:18

お礼

回答頂きありがとうございます。
いろいろとプログラムのチェックをやっていなくてミスが多いことに気づきました。
とりあえず1つ1つprintfで、格納された文字列などを確認しながら、修正して行ったところ、次のようなプログラムで、やりたかった処理ができるようになりました。
助かります。





const char* Client_private;

bool awsPrivateKey(fs::FS &fs, String path) {
//File file = SD_MMC.open(path, "r");
File file = fs.open(path, "r");

if (!file) {
Serial.printf("Can't Open File %s", path);
return false;
}
String keygenComplete;
String keygen;
while (file.available()) {
keygen = file.readStringUntil('\n');
keygenComplete += keygen + "\n";
}

Client_private = keygenComplete.c_str();

Serial.printf("data check: %s\n", Client_private);
//Serial.printf("data check: %s\n", keygenComplete.c_str());
return true;
}

投稿日時 - 2019-02-06 07:01:29

あなたにオススメの質問