質問編集履歴

1

書式の改善

2020/12/17 23:35

投稿

96chan
96chan

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,8 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- string型の16進数文字列 "48656c6c6f2c20776f726c6421" を
3
+ string型の16進数文字列から
4
4
 
5
- char *型の文字列 "Hello, world!" へと変換たいです。
5
+ char *型の文字列へと変換を行いたいです。
6
6
 
7
7
 
8
8
 
@@ -12,7 +12,35 @@
12
12
 
13
13
  ```
14
14
 
15
+ string型16進文字列 → string型文字列 → char *型文字列
16
+
17
+ と変換を行うプログラムを作成しました。
18
+
19
+
20
+
21
+ "Hello, world!"等の簡易な文字列でテストを行った際は正しく変換が行えましたが、
22
+
23
+ ソースコードに記入してあるような文字列に対して変換を行おうとすると、上手く変換が出来ませんでした。
24
+
25
+ (printしてみると期待通りの文字列が表示されない)
26
+
27
+
28
+
29
+ ※下記ソースコードの "string hex" を"48656c6c6f2c20776f726c6421"("Hello world!"の16進数表記)として
30
+
31
+ 実行すると成功正しく表示されることは確認済です。
32
+
33
+
34
+
35
+ こちらに関しましてお力添え頂けますと幸いです。
36
+
37
+
38
+
39
+ その他必要な情報等ございましたらご指示下さいませ。
40
+
41
+
42
+
15
- エラーメッセージ
43
+ よろしくお願いいたします。
16
44
 
17
45
  ```
18
46
 
@@ -24,21 +52,33 @@
24
52
 
25
53
  ```c++
26
54
 
55
+ #include <iostream>
56
+
57
+ #include <string>
58
+
59
+ #include <cstring>
60
+
61
+
62
+
63
+ using namespace std;
64
+
65
+
66
+
27
67
  void hex2stream(const std::string hexstr, std::string& str)
28
68
 
29
69
  {
30
70
 
31
- str.resize((hexstr.size() + 1) / 2);
71
+ str.resize((hexstr.size() + 1) / 2);
32
72
 
73
+
33
74
 
34
-
35
- for (size_t i = 0, j = 0; i < str.size(); i++, j++)
75
+ for (size_t i = 0, j = 0; i < str.size(); i++, j++)
36
76
 
37
77
  {
38
78
 
39
- str[i] = (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) << 4, j++;
79
+ str[i] = (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) << 4, j++;
40
80
 
41
- str[i] |= (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) & 0xF;
81
+ str[i] |= (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) & 0xF;
42
82
 
43
83
  }
44
84
 
@@ -48,30 +88,34 @@
48
88
 
49
89
  int main(){
50
90
 
51
- string hex = "48656c6c6f2c20776f726c6421";
91
+ string hex = "1f8b0800000000000003ad1a6d73da46fabb7fc55abd8bc41924ecb41f0ac69ec4715bcf248dcf71ae7383a9679156a05848747731e652fff77bf6552b21883b77cc18d0eeb3cffbebe2d3c3771f2f6eff7d7d897eb9fdf01e5d7f7efbfeea0279bd28faedf54514bdbb7da736be0ffbc7e896e282653c2b0b9c47d1e5af1ef2e69c2f0751b45eafc3f5ebb0a4b3e8f6269af345fe7d9497252361c213efece0542c890f8213f858108e51811764e4d1725a72e6a1b82c3829f8c82bcaac48c853b728d332cfcbb5381de973d332d920c637391c9ce2f86146cb5591f4e2322fe90071c1de12534033444b9c2459311ba0fef269881698ceb2423f70f2c47b38cf66b0100330a1432072709a648f06b982efe524e5038457bc34287a349bcdcd9a3d9525236f8313d65bd25e8ea724f70ca214c4eaa57891e59b01f23f7c42d73f977c9ec57e9701b33d4668960e918462d97fc8001d9f0816b544dffd205f43342792ecf10f6233cf0ad2abad948f84a6a0abc13c4b12520c5192b1658e3783a22c08b0797d731a019f825d16d36cc911df2c813ba189e80b7ec46a15e44957452c0c8c088bf1927ce214941864c53de3b483be1e2044095fd102a9a59012a01393203a8d665de4bdcaf9d0eb0054ed55419d29a8d97e284f41fdb12af7c3f90aeebbd73f02d8f0e0f9a0623f639f56d377e5026785e03e9e93f8a12b98e674c5b892e41153c4d1c8ae86a0b38c077ee80332b51dab6d79bcb19da528e0614e8a199fa33314ebaf0ab555538a734604f833fca5254581409b01dafe103e4e9141014f4747e6b0c43db6d87be818feb2093a1ca1781c3797cda96da28aec73653590936c290aa7e433cd859a5634af544394ecb066248f2ac9c9b83f0965a07e4c037fe07740057d97fd0684c81300341a09a83fff44dbbbcc6e1b69049a43323e71046c175289285e82eff53ce324cf9830edd89ef337785e96615c865f96be5e9d98e36d86b168da0c64d873dd4c70daad8e8dc13075c61b56308bcf0d195a8c88087cff96955da06def736d0e3992917fae08dd6c191d0e820abe3e9b00e08be5961b9c3b01b0581a6f04df3c69383f7c28e21a19d0c50b06f8e0d8f87862f0bd52f8da8ca04eb4594000a679f22f9c03b402038d1b9423855231a9c00c9fe063c7b58819ab7d70c809a0f2fd5d3aafc3d5f2e31a3cb95c870989cb847cbeb9ba28174bc8bc05d7b441d84ea73520a58a4041429cd99be4020a0185b247a8b0028095d32f0c0dd078d2156770f1000f7df17d0a24e1bbb16910e33c1725b18b18c9d36616325095e0063ec4cb65be09c4a12e8212b75a00dbcc302bcd27c865ec2dc150a32151385451cd7f8c0701ebd1ef818ce9f341e7fc2eba8b44719c4a0477a10cc43b88c43b08c5bb285b2c5934acbb4dc809e306b7e5212f71a2b87005afe54ca86a651a408165a1d0dc587e136a9bc8e4e241b74052289f892792900dc14309e7c8d88a22cca692a166be3586b52ac81633d04152c65299614c09e6e43227e229f0af3efc6cbd73310b191545660f3d2bff8cf0378946c35c15880a9563c67e858eca5587e5004e9a736f37174d50abf86fc0d7e9b486499542c636b9ca3a8ac15b1d9580f3a1f3fae36007f95b3c93c4bd7f789d7df95a90d897aae53ee4e6459075422b86f08a36f559bd84cb159bd70e5b2e76a66e9df774b00bd3158424b7e525c58c5cd336ef15c26c92e26a8167c4b843cdde812f62e81e60ee534876e43e13a0c691f4f15be8e7d0cb8e8bd64f9cb6ce62a83b79b2518b35817680fd7579abf0bda0a419ddb175c6e3f9350547d8a5b925bd2720a8eb61950fbddd5c254a7cdb9ebbd5e1d01c8684f017f2c7ae2420deab7cd416d5402fcd4116c0e71ffb151ecd472827875077f0a2224df3327e682f4b3bcf88c6df1fbe90c39a77069d17b0e4a0b73ece642dccd2cd07c2987063c7585f585918b4ca9e48ae85f122716b1288e611c1c74fc2493d34687a9739848e90d7f5e05d2e4897fe44e3610d1125";
52
92
 
53
- string text;
93
+ string plane;
54
94
 
55
- hex2stream(hex,)
95
+ hex2stream(hex,plane);
96
+
97
+ cout << plane << endl; // ここまでは期待通りに表示される
98
+
99
+ cout << plane.c_str() << endl; // この時点で正しく表示されない 
100
+
101
+ char *cstr = new char[plane.size()+1];
102
+
103
+ strcpy(cstr, plane.c_str());
104
+
105
+ cout << cstr << endl; // 正しく表示されない
106
+
107
+ delete[] cstr;
108
+
109
+ }
56
110
 
57
111
 
58
-
59
- }
60
112
 
61
113
  ```
62
114
 
63
115
 
64
116
 
65
- ### 試したこと
66
-
67
-
68
-
69
- ここに問題に対して試したことを記載してください。
70
-
71
117
 
72
118
 
73
119
  ### 補足情報(FW/ツールのバージョンなど)
74
120
 
75
-
76
-
77
- ここにより詳細な情報を記載してください。
121
+ g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0