質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

941閲覧

「入力された文字列中の大文字と小文字の出現回数を出力せよ。また、出現回数を格納する配列をmalloc関数を使って確保せよ。」というc言語の課題を解決したいです。

nk-kong

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/07/03 12:40

前提・実現したいこと

大学のプログラミングの授業で出題された「入力された文字列中の大文字と小文字の出現回数を出力せよ。また、出現回数を格納する配列を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言語です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/07/04 00:00 編集

課題のままですか? >標準入力で検索対象の空白と改行を含む文字列が与えられる。 >1行目に英大文字の出現回数、2行目に小文字の出現回数を出力 わからない所→出現回数は(空白、改行で区切らられた)単語単位?、数字は空白とみなす?単語の中に数字が出てきたら?・・・などなど
nk-kong

2020/07/04 06:43

自分の説明が下手で申し訳ありません。 解決したので大丈夫です。ありがとうございます。
guest

回答1

0

ベストアンサー

diffコマンドの仕様で、先頭の空白があるかないかで比較が不一致になるようです。判定プログラムが悪いと言えます。
判定プログラムを直してもらえないなら、期待する結果に合わせて出力書式を変更してみてください。

c

1 printf("%4d ", ucount[i]);

および

c

1 printf("%4d ", lcount[i]);

参考:

a.txt

text

1 123 456

b.txt

text

1 123 456

c.txt

text

1123 456

console

1$ diff -b -u a.txt b.txt 2$ diff -b -u a.txt c.txt 3--- a.txt 2020-07-03 23:15:03.547760900 +0900 4+++ c.txt 2020-07-03 23:15:15.630413700 +0900 5@@ -1 +1 @@ 6- 123 456 7+123 456

投稿2020/07/03 14:17

編集2020/07/03 15:04
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nk-kong

2020/07/04 06:41

解決しました。盲点でした。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問