質問編集履歴

10

修正

2020/06/05 03:25

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -830,6 +830,10 @@
830
830
 
831
831
  ```
832
832
 
833
+ int Search(StringsStack *s , char *x)は,スタックに積まれている文字列の中から,パターンの文字列(x の先頭からパターンが入っている)で指定された文字列を,スタックの頂上から底に向かって探
834
+
835
+ 索してし,最初に見つけたパターンを含む文字列のスタックポインタの値を戻り値として返すようにししたいです.ただし,パターンが見つからなかった場合は,-1 を返すようにします。
836
+
833
837
  [2] aa
834
838
 
835
839
  [1] bb

9

修正

2020/06/05 03:25

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -830,6 +830,18 @@
830
830
 
831
831
  ```
832
832
 
833
+ [2] aa
834
+
835
+ [1] bb
836
+
837
+ [0] cc
838
+
839
+ とスタックが積まれている場合、探索パターンをbとすると、スタックポインタがさしている1を返すようにsearch関数を実装したいです。
840
+
841
+ しかし自分のコードでは、常に-1が返されるようにsearch関数が実装されてしまっています。
842
+
833
843
  <質問>
834
844
 
835
845
  エラーは起こらないのですが、search関数がうまく動作していません。 for文の条件が違うとご指摘されたのですが、頂上から底まで探索するならどこが間違っているのか自分ではわかりませんでした。そこを教えていただきたいです。
846
+
847
+ search関数は最初に見つけたパターンを含む文字列のスタックポインタの値を戻り値として返すようにしたいです。

8

追記

2020/06/05 03:22

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -553,3 +553,283 @@
553
553
 
554
554
 
555
555
  int Search(StringsStack *s , char *x)の引数と型はこのままでお願いします。
556
+
557
+
558
+
559
+ <追記>
560
+
561
+ ```
562
+
563
+ #include <stdio.h>
564
+
565
+ #include <string.h>
566
+
567
+ #include <stdlib.h>
568
+
569
+ #define String_Max 80
570
+
571
+ /*--- 文字列型スタックを実現する構造体 ---*/
572
+
573
+ typedef struct{
574
+
575
+ int max; /* スタックの容量 */
576
+
577
+ int ptr; /* スタックポインタ */
578
+
579
+ char **stk; /* スタック本体(char* へのポインタ配列 )*/
580
+
581
+ } StringsStack;
582
+
583
+
584
+
585
+ int Search(StringsStack *s , char *x){
586
+
587
+
588
+
589
+ for(int i = s->ptr ; i <= 0 ; i --){
590
+
591
+ if(strncmp(s->stk[i], x ,strlen(x)) == 0){//strncmp先頭n文字を比較
592
+
593
+ return i;
594
+
595
+ }
596
+
597
+ }
598
+
599
+ return -1;
600
+
601
+ }
602
+
603
+
604
+
605
+ /*--- スタックの初期化 ---*/
606
+
607
+ int Initialize(StringsStack *s, int max){
608
+
609
+ s->ptr = 0;
610
+
611
+ if ((s->stk = calloc(max, sizeof(char *))) == NULL) {
612
+
613
+ s->max = 0; /* char* の配列の確保に失敗 */
614
+
615
+ return -1;
616
+
617
+ }
618
+
619
+ /* char* の配列の確保に成功 */
620
+
621
+ s->max = max;
622
+
623
+ return 0;
624
+
625
+ }
626
+
627
+ /*--- スタックの後始末 ---*/
628
+
629
+ void Terminate(StringsStack *s){
630
+
631
+ if (s->stk != NULL){
632
+
633
+ while( --s->ptr >= 0)
634
+
635
+ free(s->stk[s->ptr]); /* 動的な文字列保存用配列を解放 */
636
+
637
+ free(s->stk);
638
+
639
+ }
640
+
641
+ s->max = s->ptr = 0;
642
+
643
+ }
644
+
645
+ /*--- スタックにデータをプッシュ ---*/
646
+
647
+ int Push(StringsStack *s, char *x){
648
+
649
+ if (s->ptr >= s->max) return -1; /* スタック満杯 */
650
+
651
+ if ((s->stk[s->ptr] = calloc(strlen(x)+1, sizeof(char))) == NULL)
652
+
653
+ /* データをコピーするための動的な文字列保存用配列を確保することに失敗 */
654
+
655
+ return -1;
656
+
657
+ strcpy(s->stk[s->ptr], x);
658
+
659
+ s->ptr++;
660
+
661
+ return 0;
662
+
663
+ }
664
+
665
+ /*--- スタックからデータをポップ ---*/
666
+
667
+ int Pop(StringsStack *s, char *x){
668
+
669
+ if (s->ptr <= 0) return -1; /* スタックは空 */
670
+
671
+ s->ptr--;
672
+
673
+ strcpy(x, s->stk[s->ptr]);
674
+
675
+ free(s->stk[s->ptr]); /* ポップしたので,動的な文字列保存用配列を解放 */
676
+
677
+ return 0;
678
+
679
+ }
680
+
681
+ /*--- スタックからデータをピーク ---*/
682
+
683
+ int Peek(StringsStack *s, char *x){
684
+
685
+ if (s->ptr <= 0) return -1;
686
+
687
+ strcpy(x, s->stk[s->ptr - 1]);
688
+
689
+ return 0;
690
+
691
+ }
692
+
693
+ /*--- スタックの容量 ---*/
694
+
695
+ int Capacity(const StringsStack *s){
696
+
697
+ return s->max;
698
+
699
+ }
700
+
701
+ /*--- スタックに積まれているデータ数 ---*/
702
+
703
+ int Size(const StringsStack *s){
704
+
705
+ return s->ptr;
706
+
707
+ }
708
+
709
+ /*--- スタックの全データの表示 ---*/
710
+
711
+ void Print(const StringsStack *s){
712
+
713
+ int i;
714
+
715
+
716
+
717
+ for(i = 0; i < s->ptr; i++)
718
+
719
+ printf("%s\n", s->stk[i]);
720
+
721
+ }
722
+
723
+ int main(void){
724
+
725
+ StringsStack s;
726
+
727
+ int max;
728
+
729
+ printf("スタックの大きさを入力してください");
730
+
731
+ scanf("%d", &max);
732
+
733
+ if (Initialize(&s, max)==-1){
734
+
735
+ puts("スタックの生成に失敗しました.\n");
736
+
737
+ return 1;
738
+
739
+ }
740
+
741
+ while (1) {
742
+
743
+ int menu;
744
+
745
+ char x[String_Max];
746
+
747
+ printf("現在のデータ数:%d/%d\n",Size(&s), Capacity(&s));
748
+
749
+ printf("(1)プッシュ (2)ポップ (3)ピーク (4)表示 (5)パターン探索 (0)終了:");
750
+
751
+ scanf("%d", &menu);
752
+
753
+ if (menu == 0) break;
754
+
755
+
756
+
757
+ switch (menu) {
758
+
759
+ case 1: /* プッシュ */
760
+
761
+ printf("プッシュする文字列:");
762
+
763
+ scanf("%s", x);
764
+
765
+ if (Push(&s, x) == -1)
766
+
767
+ puts("\a エラー:プッシュに失敗しました.\n");
768
+
769
+ break;
770
+
771
+ case 2: /* ポップ */
772
+
773
+ if (Pop(&s, x) == -1)
774
+
775
+ puts("\a エラー:ポップに失敗しました.\n");
776
+
777
+ else{
778
+
779
+ printf("ポップした文字列は%s,", x);
780
+
781
+ }
782
+
783
+ break;
784
+
785
+
786
+
787
+ case 3: /* ピーク */
788
+
789
+ if (Peek(&s, x) == -1)
790
+
791
+ puts("\a エラー:ピークに失敗しました.\n");
792
+
793
+ else{
794
+
795
+ printf("ピークした文字列は%s,", x);
796
+
797
+ }
798
+
799
+ break;
800
+
801
+ case 4: /* 表示 */
802
+
803
+ Print(&s);
804
+
805
+ break;
806
+
807
+ case 5:
808
+
809
+ printf("探索する文字列");
810
+
811
+ scanf("%s",x);
812
+
813
+ int search = Search(&s,x);
814
+
815
+ if(search == -1) puts("パターンは存在しません\n");
816
+
817
+ if(search != -1) printf("%dにあります\n",search);
818
+
819
+ break;
820
+
821
+ }
822
+
823
+ }
824
+
825
+ Terminate(&s);
826
+
827
+ return 0;
828
+
829
+ }
830
+
831
+ ```
832
+
833
+ <質問>
834
+
835
+ エラーは起こらないのですが、search関数がうまく動作していません。 for文の条件が違うとご指摘されたのですが、頂上から底まで探索するならどこが間違っているのか自分ではわかりませんでした。そこを教えていただきたいです。

7

追記

2020/06/05 03:11

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -270,6 +270,278 @@
270
270
 
271
271
  ```
272
272
 
273
+ ```追記
274
+
275
+ #include <stdio.h>
276
+
277
+ #include <string.h>
278
+
279
+ #include <stdlib.h>
280
+
281
+ #define String_Max 80
282
+
283
+ /*--- 文字列型スタックを実現する構造体 ---*/
284
+
285
+ typedef struct{
286
+
287
+ int max; /* スタックの容量 */
288
+
289
+ int ptr; /* スタックポインタ */
290
+
291
+ char **stk; /* スタック本体(char* へのポインタ配列 )*/
292
+
293
+ } StringsStack;
294
+
295
+
296
+
297
+ int Search(StringsStack *s , char *x){
298
+
299
+
300
+
301
+ for(int i = s->ptr ; i <= 0 ; i --){
302
+
303
+ if(strncmp(s->stk[i], x ,strlen(x)) == 0){//strncmp先頭n文字を比較
304
+
305
+ return i;
306
+
307
+ }
308
+
309
+ }
310
+
311
+ return -1;
312
+
313
+ }
314
+
315
+
316
+
317
+ /*--- スタックの初期化 ---*/
318
+
319
+ int Initialize(StringsStack *s, int max){
320
+
321
+ s->ptr = 0;
322
+
323
+ if ((s->stk = calloc(max, sizeof(char *))) == NULL) {
324
+
325
+ s->max = 0; /* char* の配列の確保に失敗 */
326
+
327
+ return -1;
328
+
329
+ }
330
+
331
+ /* char* の配列の確保に成功 */
332
+
333
+ s->max = max;
334
+
335
+ return 0;
336
+
337
+ }
338
+
339
+ /*--- スタックの後始末 ---*/
340
+
341
+ void Terminate(StringsStack *s){
342
+
343
+ if (s->stk != NULL){
344
+
345
+ while( --s->ptr >= 0)
346
+
347
+ free(s->stk[s->ptr]); /* 動的な文字列保存用配列を解放 */
348
+
349
+ free(s->stk);
350
+
351
+ }
352
+
353
+ s->max = s->ptr = 0;
354
+
355
+ }
356
+
357
+ /*--- スタックにデータをプッシュ ---*/
358
+
359
+ int Push(StringsStack *s, char *x){
360
+
361
+ if (s->ptr >= s->max) return -1; /* スタック満杯 */
362
+
363
+ if ((s->stk[s->ptr] = calloc(strlen(x)+1, sizeof(char))) == NULL)
364
+
365
+ /* データをコピーするための動的な文字列保存用配列を確保することに失敗 */
366
+
367
+ return -1;
368
+
369
+ strcpy(s->stk[s->ptr], x);
370
+
371
+ s->ptr++;
372
+
373
+ return 0;
374
+
375
+ }
376
+
377
+ /*--- スタックからデータをポップ ---*/
378
+
379
+ int Pop(StringsStack *s, char *x){
380
+
381
+ if (s->ptr <= 0) return -1; /* スタックは空 */
382
+
383
+ s->ptr--;
384
+
385
+ strcpy(x, s->stk[s->ptr]);
386
+
387
+ free(s->stk[s->ptr]); /* ポップしたので,動的な文字列保存用配列を解放 */
388
+
389
+ return 0;
390
+
391
+ }
392
+
393
+ /*--- スタックからデータをピーク ---*/
394
+
395
+ int Peek(StringsStack *s, char *x){
396
+
397
+ if (s->ptr <= 0) return -1;
398
+
399
+ strcpy(x, s->stk[s->ptr - 1]);
400
+
401
+ return 0;
402
+
403
+ }
404
+
405
+ /*--- スタックの容量 ---*/
406
+
407
+ int Capacity(const StringsStack *s){
408
+
409
+ return s->max;
410
+
411
+ }
412
+
413
+ /*--- スタックに積まれているデータ数 ---*/
414
+
415
+ int Size(const StringsStack *s){
416
+
417
+ return s->ptr;
418
+
419
+ }
420
+
421
+ /*--- スタックの全データの表示 ---*/
422
+
423
+ void Print(const StringsStack *s){
424
+
425
+ int i;
426
+
427
+
428
+
429
+ for(i = 0; i < s->ptr; i++)
430
+
431
+ printf("%s\n", s->stk[i]);
432
+
433
+ }
434
+
435
+ int main(void){
436
+
437
+ StringsStack s;
438
+
439
+ int max;
440
+
441
+ printf("スタックの大きさを入力してください");
442
+
443
+ scanf("%d", &max);
444
+
445
+ if (Initialize(&s, max)==-1){
446
+
447
+ puts("スタックの生成に失敗しました.\n");
448
+
449
+ return 1;
450
+
451
+ }
452
+
453
+ while (1) {
454
+
455
+ int menu;
456
+
457
+ char x[String_Max];
458
+
459
+ printf("現在のデータ数:%d/%d\n",Size(&s), Capacity(&s));
460
+
461
+ printf("(1)プッシュ (2)ポップ (3)ピーク (4)表示 (5)パターン探索 (0)終了:");
462
+
463
+ scanf("%d", &menu);
464
+
465
+ if (menu == 0) break;
466
+
467
+
468
+
469
+ switch (menu) {
470
+
471
+ case 1: /* プッシュ */
472
+
473
+ printf("プッシュする文字列:");
474
+
475
+ scanf("%s", x);
476
+
477
+ if (Push(&s, x) == -1)
478
+
479
+ puts("\a エラー:プッシュに失敗しました.\n");
480
+
481
+ break;
482
+
483
+ case 2: /* ポップ */
484
+
485
+ if (Pop(&s, x) == -1)
486
+
487
+ puts("\a エラー:ポップに失敗しました.\n");
488
+
489
+ else{
490
+
491
+ printf("ポップした文字列は%s,", x);
492
+
493
+ }
494
+
495
+ break;
496
+
497
+
498
+
499
+ case 3: /* ピーク */
500
+
501
+ if (Peek(&s, x) == -1)
502
+
503
+ puts("\a エラー:ピークに失敗しました.\n");
504
+
505
+ else{
506
+
507
+ printf("ピークした文字列は%s,", x);
508
+
509
+ }
510
+
511
+ break;
512
+
513
+ case 4: /* 表示 */
514
+
515
+ Print(&s);
516
+
517
+ break;
518
+
519
+ case 5:
520
+
521
+ printf("探索する文字列");
522
+
523
+ scanf("%s",x);
524
+
525
+ int search = Search(&s,x);
526
+
527
+ if(search == -1) puts("パターンは存在しません\n");
528
+
529
+ if(search != -1) printf("%dにあります\n",search);
530
+
531
+ break;
532
+
533
+ }
534
+
535
+ }
536
+
537
+ Terminate(&s);
538
+
539
+ return 0;
540
+
541
+ }
542
+
543
+ ```
544
+
273
545
  パターンの文字列を指定すると,スタック上の文字列の中から入力したパターンを,
274
546
 
275
547
  スタックの頂上から底に向かって探索し,最初に見つけたパターンを含む文字列のスタックポインタの値を返す関数 Searchを作りたいです。

6

修正

2020/06/05 03:03

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- for(int i = s->ptr ; i < 0 ; i --){
29
+ for(int i = s->ptr ; i <= 0 ; i --){
30
30
 
31
31
  if(strncmp(s->stk[i], x ,strlen(x)) == 0){//strncmp先頭n文字を比較
32
32
 
@@ -272,6 +272,10 @@
272
272
 
273
273
  パターンの文字列を指定すると,スタック上の文字列の中から入力したパターンを,
274
274
 
275
+ スタックの頂上から底に向かって探索し,最初に見つけたパターンを含む文字列のスタックポインタの値を返す関数 Searchを作りたいです。
276
+
277
+ パターンの文字列を指定すると,スタック上の文字列の中から入力したパターンを,
278
+
275
279
  スタックの頂上から底に向かって探索し,最初に見つけたパターンを含む文字列のスタックポインタの値を返す関数 Searchを自分でつくりました。
276
280
 
277
281
 

5

修正

2020/06/05 02:56

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -274,26 +274,6 @@
274
274
 
275
275
  スタックの頂上から底に向かって探索し,最初に見つけたパターンを含む文字列のスタックポインタの値を返す関数 Searchを自分でつくりました。
276
276
 
277
- main.c: In function ‘main’:
277
+
278
-
279
- main.c:125:2: error: expected ‘;’ before ‘scanf’
280
-
281
- scanf("%s",x);
282
-
283
- ^~~~~
284
-
285
- main.c:126:25: warning: passing argument 2 of ‘Search’ from incompatible pointer type [-Wincompatible-pointer-types]
286
-
287
- int search = Search(&s,&x);
288
-
289
- ^
290
-
291
- main.c:12:5: note: expected ‘char *’ but argument is of type ‘char (*)[80]’
292
-
293
- int Search(StringsStack *s , char *x){
294
-
295
-
296
-
297
- このようなエラーが出たのですが、有識者様解決法をご教示お願いします。
298
278
 
299
279
  int Search(StringsStack *s , char *x)の引数と型はこのままでお願いします。

4

修正

2020/06/05 02:51

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  for(int i = s->ptr ; i < 0 ; i --){
30
30
 
31
- if(strncmp(s->stk[i], x ,sizeof(x)) == 0){//strncmp先頭n文字を比較
31
+ if(strncmp(s->stk[i], x ,strlen(x)) == 0){//strncmp先頭n文字を比較
32
32
 
33
33
  return i;
34
34
 
@@ -250,7 +250,7 @@
250
250
 
251
251
  scanf("%s",x);
252
252
 
253
- int search = Search(&s,&x);
253
+ int search = Search(&s,x);
254
254
 
255
255
  if(search == -1) puts("パターンは存在しません\n");
256
256
 

3

修正

2020/06/05 02:40

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -246,7 +246,7 @@
246
246
 
247
247
  case 5:
248
248
 
249
- printf("探索する文字列")
249
+ printf("探索する文字列");
250
250
 
251
251
  scanf("%s",x);
252
252
 

2

修正

2020/06/05 02:28

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -24,15 +24,15 @@
24
24
 
25
25
  int Search(StringsStack *s , char *x){
26
26
 
27
-
27
+
28
28
 
29
29
  for(int i = s->ptr ; i < 0 ; i --){
30
30
 
31
- if(strncmp(s->stk[i], x ,sizeof(x)) == 0){//strncmp先頭n文字を比較
31
+ if(strncmp(s->stk[i], x ,sizeof(x)) == 0){//strncmp先頭n文字を比較
32
-
32
+
33
- return s->stk[i];
33
+ return i;
34
-
34
+
35
- }
35
+ }
36
36
 
37
37
  }
38
38
 
@@ -246,15 +246,17 @@
246
246
 
247
247
  case 5:
248
248
 
249
- printf("探索するパターンの文字列")
249
+ printf("探索する文字列")
250
250
 
251
251
  scanf("%s",x);
252
252
 
253
- int search = Search(&s,&x);
253
+ int search = Search(&s,&x);
254
-
254
+
255
- if(search == -1) puts("パターンは存在しません\n");
255
+ if(search == -1) puts("パターンは存在しません\n");
256
-
256
+
257
- if(search != -1) printf("%dにあります\n",search);
257
+ if(search != -1) printf("%dにあります\n",search);
258
+
259
+ break;
258
260
 
259
261
  }
260
262
 
@@ -290,7 +292,7 @@
290
292
 
291
293
  int Search(StringsStack *s , char *x){
292
294
 
293
- ^~~~~~
295
+
294
296
 
295
297
  このようなエラーが出たのですが、有識者様解決法をご教示お願いします。
296
298
 

1

修正

2020/06/05 02:26

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -24,15 +24,15 @@
24
24
 
25
25
  int Search(StringsStack *s , char *x){
26
26
 
27
-
27
+
28
28
 
29
29
  for(int i = s->ptr ; i < 0 ; i --){
30
30
 
31
- if(strncmp(s->stk[i], x ,sizeof(x)) == 0){//strncmp先頭n文字を比較
31
+ if(strncmp(s->stk[i], x ,sizeof(x)) == 0){//strncmp先頭n文字を比較
32
-
32
+
33
- return s->stk[i];
33
+ return s->stk[i];
34
-
34
+
35
- }
35
+ }
36
36
 
37
37
  }
38
38
 
@@ -250,11 +250,11 @@
250
250
 
251
251
  scanf("%s",x);
252
252
 
253
- int search = Search(&s,&x);
253
+ int search = Search(&s,&x);
254
-
254
+
255
- if(search == -1) puts("パターンは存在しません\n");
255
+ if(search == -1) puts("パターンは存在しません\n");
256
-
256
+
257
- if(search != -1) printf("%dにあります\n",search);
257
+ if(search != -1) printf("%dにあります\n",search);
258
258
 
259
259
  }
260
260
 
@@ -272,14 +272,6 @@
272
272
 
273
273
  スタックの頂上から底に向かって探索し,最初に見つけたパターンを含む文字列のスタックポインタの値を返す関数 Searchを自分でつくりました。
274
274
 
275
- main.c: In function ‘Search’:
276
-
277
- main.c:16:16: warning: return makes integer from pointer without a cast [-Wint-conversion]
278
-
279
- return s->stk[i];
280
-
281
- ~~~~~~^~~
282
-
283
275
  main.c: In function ‘main’:
284
276
 
285
277
  main.c:125:2: error: expected ‘;’ before ‘scanf’