前提・実現したいこと
大学のプログラミングの授業で出題された「入力された文字列中の大文字と小文字の出現回数を出力せよ。また、出現回数を格納する配列をmalloc関数を使って確保せよ。」というc言語の課題を解決したいです。
正解の実行例
$ ./letter_histogram abcde fghij klmno pqrst uvwxy zz ABCDE ABCDE AAA BB C 01234 Z <Ctrl+D> 5 4 3 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
標準入力で検索対象の空白と改行を含む文字列が与えられる。
1行目に英大文字の出現回数、2行目に小文字の出現回数を出力
該当のソースコード
c
1#include<stdio.h> 2#include<stdlib.h> 3#define N_ALPHABET 26 4 5int main(){ 6 7 int *ucount; 8 ucount = (int *)malloc(26 * sizeof(int)); 9 if(ucount == NULL){ 10 fprintf(stderr, "Can not allocate memory\n"); 11 return 1; 12 } 13 14 int i; 15 for(i=0;i<N_ALPHABET;i++){ 16 ucount[i]=0; 17 } 18 19 int *lcount; 20 lcount = (int *)malloc(26 * sizeof(int)); 21 if(lcount == NULL){ 22 fprintf(stderr, "Can not allocate memory\n"); 23 return 1; 24 } 25 26 for(i=0;i<N_ALPHABET;i++){ 27 lcount[i]=0; 28 } 29 30 int cc; 31 32 char capital[N_ALPHABET]={'A','B','C','D','E','F','G','H','I','J','K','L','M', 33 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; 34 35 char small[N_ALPHABET]={'a','b','c','d','e','f','g','h','i','j','k','l','m', 36 'n','o','p','q','r','s','t','u','v','w','x','y','z'}; 37 38 int j; 39 while((cc = getchar()) != EOF){ 40 41 for(j=0;j<N_ALPHABET;j++){ 42 43 if(capital[j] == cc){ 44 ucount[j] += 1; 45 } 46 47 else if(small[j] == cc){ 48 lcount[j] += 1; 49 } 50 51 } 52 53 if(cc == ' ' || cc == '\n'){ 54 continue; 55 } 56 } 57 58 for(i=0;i<N_ALPHABET;i++){ 59 printf(" %d ", ucount[i]); 60 } 61 62 printf("\n"); 63 64 for(i=0;i<N_ALPHABET;i++){ 65 printf(" %d ", lcount[i]); 66 } 67 68 printf("\n"); 69 70 free(ucount); 71 72 free(lcount); 73 74 return 0; 75}
試したこと
上記のコードをCygwin64 Terminalで「$make test」のコマンドを実行したところ、以下のような問題が発生しました。
$ make test ==== テスト 1 (Test case 1) ==== $ ./letter_histogram abcde fghij klmno pqrst uvwxy z ABCDE ABCDE AAA BB C 01234 5 4 3 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 テスト 1 成功(passed) ==== テスト 2 (Test case 2) ==== $ ./letter_histogram dpMhhyPmc yI DT iJUXpNfh RpV PPWJGvcE nuUB jqYjBrPqs cS ysO rDE eRiZNQS YjwrGKI Ujg OeurKNK zTSGVHej SxR iDmueNb 0 2 0 3 2 0 3 1 2 2 3 0 1 4 2 4 1 3 4 2 3 2 1 1 2 1 0 1 3 1 4 1 1 3 3 5 0 0 2 1 0 3 2 4 2 0 3 1 1 1 3 1 テスト 2 成功(passed) ==== テスト 3 (Test case 3) ==== $ ./letter_histogram YjbiSz VdGaIJ kJSJQNxNX YoPZY Rwe FX zUUCazG lttNJ dVeNwI ZMEyXkOmg XGHW VBHJ MkcR LdZT KHO LI InoJhFI Yo JKSBedv CEgYo xvulXS pIIC wFj Lw 6行目以降は省略(tests/3.in) 0 3 3 3 5 4 5 3 7 9 3 4 7 6 2 2 2 3 5 4 2 3 3 9 6 4 3 2 2 7 5 2 6 2 2 3 5 2 2 3 5 3 4 0 3 6 2 3 5 6 2 4 テスト 3 成功(passed) ==== テスト 4 (Test case 4) ==== $ ./letter_histogram THE TRAGEDY OF ROMEO AND JULIET by William Shakespeare 6行目以降は省略(tests/4.in) 635 354 376 189 475 247 183 270 1053 211 22 241 414 353 470 256 3 574 446 805 91 63 453 6 129 2 7583 1444 1869 3797 12160 1864 1686 6662 5832 75 832 4627 3083 6201 8262 1328 62 6084 6292 8818 3527 1012 2146 131 2525 31 ==== 期待される出力 (Correct output) ==== 635 354 376 189 475 247 183 270 1053 211 22 241 414 353 470 256 3 574 446 805 91 63 453 6 129 2 7583 1444 1869 3797 12160 1864 1686 6662 5832 75 832 4627 3083 6201 8262 1328 62 6084 6292 8818 3527 1012 2146 131 2525 31 ==== 出力の違い (Different lines) ==== --- 4.correct 2020-06-30 22:01:52.565106300 +0900 +++ 4.out 2020-07-03 21:35:23.050075200 +0900 @@ -1,2 +1,2 @@ 635 354 376 189 475 247 183 270 1053 211 22 241 414 353 470 256 3 574 446 805 91 63 453 6 129 2 -7583 1444 1869 3797 12160 1864 1686 6662 5832 75 832 4627 3083 6201 8262 1328 62 6084 6292 8818 3527 1012 2146 131 2525 31 + 7583 1444 1869 3797 12160 1864 1686 6662 5832 75 832 4627 3083 6201 8262 1328 62 6084 6292 8818 3527 1012 2146 131 2525 31 ================ テスト 4 失敗(failed) 3個のテストは成功しましたが, テスト 4 に失敗しました. (A test case is failed) プログラムを確認してください.(3)
なぜテスト4で失敗してしまうのか、どなたか教えていただけますでしょうか。
補足情報
C言語です。
回答1件
あなたの回答
tips
プレビュー