ページ 11

C++が分からない

Posted: 2017年9月04日(月) 21:19
by にこよん
C++を勉強し始めたのですがよくわからないので質問させていただきました。

32桁の16進数をランダムに生成し、これを文字列の型に保存し、画面に表示を永遠に繰り返すようなプログラムを作成しようと考えています。

しかし文字列の保存の型が6、7個あり、よくわからないのと、調べても理解できる答えがなかったため質問させていただきました。
どのように書けばいいのかご教授ください(__)

以下頑張って作ろうとしたコード

コード:

#include <iostream>			//出力演算子 << と 入力演算子 >>
#include <string>
#include <cstdlib>
#include <ctime>
#include <windows.h>


#include <sstream>
#include <iomanip>


int main()
{
	srand((unsigned)time(NULL));							//乱数の初期値を時間で変更

	std::string kazu32;
//	std::stringstream kazu32;

	for (int i = 1; i < 33; i++)
		std::cout << std::setfill('0') << std::setw(2) << i << ' ';
	std::cout << std::endl;


	for (int i = 0; i < 32; i++)
		kazu32 += std::to_string(rand() % 0x10) + ' ';
	//↑16進数にしたいです。あと、仮に001のような形にして分かりやすく並べたいです。
	//最終的にはa8e789b00c...のような32桁の16進数にしたい

	std::cout << kazu32;

	std::cin.get();
	Sleep(1000);
}
それとC++で文字列を扱うのはとても大変でした。
C言語の拡張版とのことですが、慣れればCのcharより使いやすいのでしょうか?
普段文字列を扱うならばどのような型を使えばいいでしょうか?

Re: C++が分からない

Posted: 2017年9月04日(月) 23:28
by Dixq (管理人)
32桁の整数ということはlong long型でも計算しきれませんが、多倍長整数を扱うようなことをしないといけないという仕様ですか?
提示されたコードはそうではないようなので、1桁ずつ文字列にしてみます。
to_stringでは16進数表記にできないのと、C#やJAVAのようなString.format機能もないので、自作するしかなさそうです。

コード:

#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <string>
#include <limits>
#include <iostream>

using namespace std;

string to_hexString(int val)
{
    char buffer[std::numeric_limits<int>::digits10 + 2]; // '-' + NULL
    std::sprintf(buffer, "%x", val);
    return buffer;
}

int main() {
    string str;
    for (int i = 0; i < 32; i++) {
        str += to_hexString(rand()%16);
    }
    cout << str;
}
またはstringstreamを使う方法も考えられます。

コード:

#include <iostream>
#include <sstream>

using namespace std;

int main() {
    stringstream ss;
    for (int i = 0; i < 32; i++) {
        ss << std::hex << (rand()%16);
    }
    cout << ss.str();
}
実行結果
93e41c6e20911b9b36bc7ce94edc677e

Re: C++が分からない

Posted: 2017年9月05日(火) 20:31
by maru
にこよん さんが書きました:それとC++で文字列を扱うのはとても大変でした。
C言語の拡張版とのことですが、慣れればCのcharより使いやすいのでしょうか?
え!? ”char”は文字「列」ではなく、文字だと思っていたのですが...
というツッコミはさておき、c/c++言語にはネイティブな「文字列」型はありません。
c言語のstr??関数群は0で終端されたchar配列を文字列とみなして処理を行う標準ライブラリ関数群であり「文字列」型という型はありません。
(終端の0を忘れるとひどい目に会う!)

c++では、型と同様に扱うこのが可能なクラスを定義することができ、さらに標準ライブラリとしてstringクラス等が用意されているので、c言語には存在しない「文字列」型が使用可能であると言ってももよいと考えられます。
例えば、cでは文字列の連結を行うにはstrcat関数を使用しますが、c++では+演算子を使用できます(実際には効率を考えてstringstream等を使用しますが...)。

以上の理由から、文字列を扱うのはcよりc++のほうがはるかにに簡単で「安全」であると思います。

Re: C++が分からない

Posted: 2017年9月05日(火) 23:22
by にこよん
なるほどできました。ありがとうございます。

コード:

str();
を使うと文字列として受け取れるんですか...
string型じゃないとかどうとかエラーが出たので
stringstream型は使わない方法があるのかと思っていましたが...
ありがとうございました。

Re: maru様

Posted: 2017年9月05日(火) 23:36
by にこよん
C言語以外触ったことがないので文字列というものはいまいちわかりませんが、安全であるならとてもうれしいですね。
簡単なんですか...これが....

コード:

str::aaa.
とか打ったらえげつなく次に続く関数が出てくるので第一印象ですごくややこしそうだなーと
ですがこっちのほうがいいのなら迷わず勉強できます。
maru さんありがとうございました。(__)

Re: C++が分からない

Posted: 2017年9月06日(水) 08:31
by Dixq (管理人)
C++勉強中であれば一旦、一切charを使わず文字列を扱う時は全てstringを使うようにしてみて良いと思います。
DXライブラリを利用していると一時的にchar*を扱わないといけないことがありますが、
その時はstring::c_str();でstringをconst char*に変換できます。

後、なんとなく関数がいっぱいあるから大変そう、と思うのではなく、関数の説明を見て把握しましょう。
https://cpprefjp.github.io/reference/st ... tring.html
モダンな言語ほど大量に便利な関数があるので、沢山関数があるというのは利用者にとって嬉しいことです。
C++はその点便利関数が不十分で欠陥言語レベルなので自作しないといけないことはよくありますが・・。
モダンな言語は「こんな機能あったらいいのに」と思うことは大抵標準機能として存在します。

Re: C++が分からない

Posted: 2017年9月06日(水) 23:49
by にこよん
アドバイスありがとうございます。
頑張ります。
C++を勉強し始めたのは竜神録2プログラミングの館が読めなかったからなんですが(笑)