合計 昨日 今日

C++が分からない

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: にこよん
[URL]
初心者(6,103 ポイント)
Date: 2017年9月04日(月) 21:19
No: 1
(OFFLINE)

 C++が分からない

C++を勉強し始めたのですがよくわからないので質問させていただきました。

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

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

以下頑張って作ろうとしたコード
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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より使いやすいのでしょうか?
普段文字列を扱うならばどのような型を使えばいいでしょうか?
最近は東方風アクションゲームを少しずつ作ってる人です。

Name: Dixq (管理人)
(管理人)
[URL]
ウィザード(1,482,682 ポイント)
Date: 2017年9月04日(月) 23:28
No: 2
(OFFLINE)

 Re: C++が分からない

32桁の整数ということはlong long型でも計算しきれませんが、多倍長整数を扱うようなことをしないといけないという仕様ですか?
提示されたコードはそうではないようなので、1桁ずつ文字列にしてみます。
to_stringでは16進数表記にできないのと、C#やJAVAのようなString.format機能もないので、自作するしかなさそうです。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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を使う方法も考えられます。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
#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

Name: maru
[URL]
中級者(11,851 ポイント)
Date: 2017年9月05日(火) 20:31
No: 3
(OFFLINE)

 Re: C++が分からない

にこよん さんが書きました:それとC++で文字列を扱うのはとても大変でした。
C言語の拡張版とのことですが、慣れればCのcharより使いやすいのでしょうか?

え!? ”char”は文字「列」ではなく、文字だと思っていたのですが...
というツッコミはさておき、c/c++言語にはネイティブな「文字列」型はありません。
c言語のstr??関数群は0で終端されたchar配列を文字列とみなして処理を行う標準ライブラリ関数群であり「文字列」型という型はありません。
(終端の0を忘れるとひどい目に会う!)

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

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

Name: にこよん
[URL]
初心者(6,103 ポイント)
Date: 2017年9月05日(火) 23:22
No: 4
(OFFLINE)

 Re: C++が分からない

[解決!]

なるほどできました。ありがとうございます。

コード[C++]: 全て選択
1
str();

を使うと文字列として受け取れるんですか...
string型じゃないとかどうとかエラーが出たので
stringstream型は使わない方法があるのかと思っていましたが...
ありがとうございました。
最近は東方風アクションゲームを少しずつ作ってる人です。

Name: にこよん
[URL]
初心者(6,103 ポイント)
Date: 2017年9月05日(火) 23:36
No: 5
(OFFLINE)

 Re: maru様

[解決!]

C言語以外触ったことがないので文字列というものはいまいちわかりませんが、安全であるならとてもうれしいですね。
簡単なんですか...これが....
コード[C++]: 全て選択
1
str::aaa.

とか打ったらえげつなく次に続く関数が出てくるので第一印象ですごくややこしそうだなーと
ですがこっちのほうがいいのなら迷わず勉強できます。
maru さんありがとうございました。(__)
最近は東方風アクションゲームを少しずつ作ってる人です。

Name: Dixq (管理人)
(管理人)
[URL]
ウィザード(1,482,682 ポイント)
Date: 2017年9月06日(水) 08:31
No: 6
(OFFLINE)

 Re: C++が分からない

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

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

Name: にこよん
[URL]
初心者(6,103 ポイント)
Date: 2017年9月06日(水) 23:49
No: 7
(OFFLINE)

 Re: C++が分からない

[解決!]

アドバイスありがとうございます。
頑張ります。
C++を勉強し始めたのは竜神録2プログラミングの館が読めなかったからなんですが(笑)
最近は東方風アクションゲームを少しずつ作ってる人です。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[24人]