質問編集履歴

3

わかったこと、わからないことの明確化

2018/05/16 05:03

投稿

nsd24
nsd24

スコア9

test CHANGED
File without changes
test CHANGED
@@ -158,11 +158,27 @@
158
158
 
159
159
  具体的な書き方がつかめておらず、何点か不明な点があります。
160
160
 
161
+
162
+
163
+ 〇わからないこと
164
+
165
+
166
+
161
167
   ・//str=(char *)malloc(sizeof(char)*n);では、エラーがでなかったがその直下にあるようにfor文でループさせるとエラーがでます。なぜでしょうか?また、このnは文字列の個数(何個の文字列を入力するか)なのですが、本来は1つ1つの文字列の長さ(文字が何個あるか)を入れるべきなのですが、文字列の長さを計算するにはまず文字列を入力しなければならないわけで、??となっております。
162
168
 
163
-  ・sort関数内で、tはint型で宣言されています。ここに代入するには文字列の先頭アドレスを代入すればいい、という認識でっているのでしょうか?(問題には参考としてバブルソートが書かれているだけなので無理して合わせる必要はない、とは思いますが)
169
+  ・sort関数内で、tはint型で宣言されています。ここに代入するには文字列の先頭アドレスを代入すればいい、という認識でっているのでしょうか?(問題には参考としてバブルソートが書かれているだけなので無理して合わせる必要はない、とは思いますが)
170
+
171
+
172
+
164
-
173
+ 〇わかったこと
174
+
165
-
175
+  ・//str=(char *)malloc(sizeof(char)*n);の意味
176
+
177
+ char型のサイズ(1バイト)×n(ここでは文字列の個数(何個の文字列を入力するか)ですが)分のメモリをmalloc関数で確保し、それを(char *)に明示的に変換している。(左辺のポインタ変数strにあわせている?)
178
+
179
+  ・関数sortの引数にポインタのポインタ(アドレス)があるが、そこにはポインタ変数のアドレスを渡せばよい。
180
+
181
+  ・参考として↑にあるバブルソートには文字列がint型に入っているが、そこにはポインタのアドレスを渡せばよい。
166
182
 
167
183
  ```C
168
184
 

2

質問事項の詳細の追加

2018/05/16 05:03

投稿

nsd24
nsd24

スコア9

test CHANGED
File without changes
test CHANGED
@@ -154,9 +154,175 @@
154
154
 
155
155
  ```
156
156
 
157
- ②についてが、正直に言うとほとんどわかりません。
158
-
159
-
157
+ ②についてが、正直に言うとほとんどわかりませんでしたが、回答者の皆様のおかげですこしずつイメージ自体はつかめるようになってきましたそこで、コードを書いてみましたがいくつかエラーが出てしまいました。
158
+
159
+ 具体的な書き方がつかめておらず、何点か不明な点があります。
160
+
161
+  ・//str=(char *)malloc(sizeof(char)*n);では、エラーがでなかったがその直下にあるようにfor文でループさせるとエラーがでます。なぜでしょうか?また、このnは文字列の個数(何個の文字列を入力するか)なのですが、本来は1つ1つの文字列の長さ(文字が何個あるか)を入れるべきなのですが、文字列の長さを計算するにはまず文字列を入力しなければならないわけで、??となっております。
162
+
163
+  ・sort関数内で、tはint型で宣言されています。ここに代入するには文字列の先頭アドレスを代入すればいい、という認識で会っているのでしょうか?(問題には参考としてバブルソートが書かれているだけなので無理して合わせる必要はない、とは思いますが)
164
+
165
+
166
+
167
+ ```C
168
+
169
+ #include<stdio.h>
170
+
171
+ #include<stdlib.h>
172
+
173
+
174
+
175
+ int hantei(char *a, char *b);
176
+
177
+ void sort(char **argv,int n);
178
+
179
+
180
+
181
+ int main(void)
182
+
183
+ {
184
+
185
+ char *str;
186
+
187
+ char enter;
188
+
189
+ int i,n;
190
+
191
+
192
+
193
+ printf("複数の文字列配列を辞書順に並び替えるぞ\n");
194
+
195
+ printf("文字列の個数入力して→");
196
+
197
+ scanf("%d",&n);
198
+
199
+
200
+
201
+ enter=getchar();
202
+
203
+
204
+
205
+ //str=(char *)malloc(sizeof(char)*n); //下記にて説明有り
206
+
207
+ for(i=0;i<n;i++){
208
+
209
+ (str+i)=(char *)malloc(sizeof(char)*n); //「左辺値が必要」とエラーがでます
210
+
211
+ }
212
+
213
+
214
+
215
+ for(i=0;i<n;i++){
216
+
217
+ printf("%dつ目の文字列を入力しよ> ",i+1);
218
+
219
+ scanf("%s",str+i);
220
+
221
+ }
222
+
223
+
224
+
225
+ sort(&str,n);
226
+
227
+
228
+
229
+ for(i=0;i<n;i++){
230
+
231
+ printf("辞書順に文字列を出力します。\n");
232
+
233
+ printf("%s\n",str+i);
234
+
235
+ }
236
+
237
+
238
+
239
+ return 0;
240
+
241
+ }
242
+
243
+
244
+
245
+ void sort(char **argv,int n)
246
+
247
+ {
248
+
249
+ int i,j,t;
250
+
251
+
252
+
253
+ if(n==1){
254
+
255
+ printf("データ1個しかないですよ\n");
256
+
257
+ }
258
+
259
+ else{
260
+
261
+ for(i=n-1;i>=0;i--){ //「char *型はint型に変換できない」とエラーが出ます。
262
+
263
+ for(j=0;j<n;j++){
264
+
265
+ if(hantei(*(argv+j),*(argv+j+1))==-1){
266
+
267
+ t=*(argv+j);
268
+
269
+ *(argv+j)=*(argv+j+1);
270
+
271
+ *(argv+j+1)=t;
272
+
273
+ }
274
+
275
+ }
276
+
277
+ }
278
+
279
+ }
280
+
281
+ }
282
+
283
+
284
+
285
+ int hantei(char *a,char *b)
286
+
287
+ {
288
+
289
+ int i;
290
+
291
+
292
+
293
+ for(i=0;*(a+i)!='\0' && *(b+i)!='\0';i++){
294
+
295
+ if(*(a+i)<*(b+i)){
296
+
297
+ return 1;
298
+
299
+ }
300
+
301
+ else if(*(a+i)>*(b+i)){
302
+
303
+ return -1;
304
+
305
+ }
306
+
307
+ }
308
+
309
+ if(*(a+i)!='\0'){
310
+
311
+ return -1;
312
+
313
+ }
314
+
315
+ else if(*(b+i)!='\0'){
316
+
317
+ return 1;
318
+
319
+ }
320
+
321
+ return 0;
322
+
323
+ }
324
+
325
+ ```
160
326
 
161
327
 
162
328
 

1

誤字

2018/05/16 04:52

投稿

nsd24
nsd24

スコア9

test CHANGED
File without changes
test CHANGED
@@ -290,7 +290,7 @@
290
290
 
291
291
 
292
292
 
293
-
293
+ 未熟者ですがどうかご指導よろしくお願いします。
294
294
 
295
295
  ### 補足情報(FW/ツールのバージョンなど)
296
296