回答編集履歴

1

追加

2020/09/02 13:18

投稿

amiya
amiya

スコア1218

test CHANGED
@@ -49,3 +49,147 @@
49
49
  内容としては、
50
50
 
51
51
  `*string = 'A';`に続いて`string++;`をしたのと同じになります。
52
+
53
+
54
+
55
+
56
+
57
+ ---
58
+
59
+
60
+
61
+ 全体の流れが判りやすいようにコメントを付けます。
62
+
63
+
64
+
65
+ ```C
66
+
67
+ #include <string.h>
68
+
69
+ #include <stdlib.h> //malloc
70
+
71
+
72
+
73
+ char* get_strings(const char *city)
74
+
75
+ {
76
+
77
+ int i, j, n;
78
+
79
+ n = strlen(city);
80
+
81
+ char *string;
82
+
83
+ string = malloc( n * 4 + 1);
84
+
85
+ char *base = string;
86
+
87
+
88
+
89
+ for(i = 0; i < n; i++ ) //元の文字列から一つずつ文字をとる
90
+
91
+ {
92
+
93
+
94
+
95
+ int count = 0;
96
+
97
+ int count2 = 0;
98
+
99
+
100
+
101
+ for(j = 0; j < n; j++) //元の文字列の中に同じ文字があるかカウント
102
+
103
+ {
104
+
105
+ if(city[i] == city[j])count++; //自分があるので最低1以上
106
+
107
+ }
108
+
109
+
110
+
111
+ *string++ = city[i]; //全ての文字を無条件で提示用に登録
112
+
113
+ *string++ = ':';
114
+
115
+
116
+
117
+ if(i > 0) //iが1以上なら=1文字目だけを除いて以下を処理
118
+
119
+ {
120
+
121
+ for(int b = i - 1; b == 0; b--) //今の文字より前の文字を調べる
122
+
123
+ {
124
+
125
+ if(city[i] == city[b])count2++; //同じ文字があればカウント
126
+
127
+ }
128
+
129
+ }
130
+
131
+
132
+
133
+
134
+
135
+ if(count2 != 0) //自分より前に同じ文字があれば
136
+
137
+ {
138
+
139
+ for(int a = 1; a == count; a++) //カウントした数だけ
140
+
141
+ {
142
+
143
+ *string++ ='*'; //*を付ける
144
+
145
+ }
146
+
147
+
148
+
149
+ if(i != (n -1)) //最後の文字以外なら
150
+
151
+ {
152
+
153
+ *string++ = ','; //,を付ける
154
+
155
+ }
156
+
157
+ else if(i == (n - 1))       //最後の文字以外ではなく最後の文字なら(if不要)
158
+
159
+ {
160
+
161
+ *string++ = '\0'; //末端文字を付ける
162
+
163
+ }
164
+
165
+ }
166
+
167
+ }
168
+
169
+ return base;
170
+
171
+ }
172
+
173
+ ```
174
+
175
+
176
+
177
+ まずは、大文字と小文字を区別しないという処理がありません。
178
+
179
+ 次に、表示用文字列に対して、文字を登録する時に、問答無用で登録してしまっているので、
180
+
181
+ `C:h:i:c:a:g:o:`の様に、二つ目の`c`が登場してしまっています。
182
+
183
+ 2つ以上ある文字の2度目の登場はスルーする必要があります。
184
+
185
+
186
+
187
+ `*`が出ないのは、`*`を出すかを決める条件が、「自分よりも前に同じ文字が1つ以上あれば」となっています。
188
+
189
+ Chicagoの文字列の中で、大文字小文字を区別した場合、「自分よりも前に同じ文字が1つ以上」あるものは存在しないので、`*`が表示されません。
190
+
191
+ 「自分よりも前に同じ文字が1つ以上あれば、その数の`*`を表示する」ではなく、
192
+
193
+ 「文字列の中に自分と同じ文字があった数の`*`を表示する」とする必要があります。
194
+
195
+ (自分自身を含むので必ず1以上の`*`は付きます)