ここから本文です

C言語です。

ko_********さん

2019/7/815:13:18

C言語です。

入力リダイレクトで読み込んだテキストファイル中の3文字の単語を全て抜き出し各単語の出現回数をカウント、多い順にソートするプログラムを作っています。
以下は学校から提示されたサンプルプログラムです。

#include <stdio.h>
#define MAXSTR 1024
#define WORDLEN 3

struct tango
{
char word[10];
int count;
};

//
// 文字列 s の長さを求める
//
int strlength(char s[])
{
int len = 0;
while(*s++){
len++;
}
return len;
}

//
// 2つの文字列 s1 と s2 が何文字目まで等しいか調べる
//
int stringcmp(char s1[], char s2[])
{
int i;
for(i = 0; i < WORDLEN; i++){
if(s1[i] != s2[i])
return i;
}
return i;
}

//
// 文字列 s がすでに配列 c に存在するかを調べる
//
int checktango(char s[], struct tango c[], int num)
{
int i;
for(i = 0; i < num; i++){
if(stringcmp(s, c[i].word) == WORDLEN)
return i;
}
return -1;
}

//
// 文字列 s2 を s1 にコピーする
//
int stringcopy(char s1[], char s2[])
{
int i;
for(i = 0; i < WORDLEN; i++)
s1[i] = s2[i];
s1[WORDLEN] = 0;
return 0;
}

//
// 結果をソートする
//
void wordsort(struct tango c[], int n)
{
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if(c[j].count > c[j+1].count){
struct tango tmp;
tmp = c[j];
c[j] = c[j+1];
c[j+1] = tmp;
}
}
}
}


//
// main 関数
//
int main(void)
{
char s[MAXSTR];
int i, ntango = 0;
struct tango collect[4000];


while(1){
int ch;
i = scanf("%s", s);
if(i == EOF)
break;
if(strlength(s) == WORDLEN)
if((ch = checktango(s, collect, ntango)) != -1){
stringcopy(collect[ch].word, s);
collect[ch].count += 1;
}else{
stringcopy(collect[ntango].word, s);
collect[ntango].count = 1;
// printf("%d: %s\n", ntango, s);
ntango++;
}
}
wordsort(collect, ntango);
for(i = 0; i < ntango; i++){
printf("%d: %s\n", collect[i].count, collect[i].word);
}
}

課題はand,やday.などが4文字と認識されてしまい、or,やit,などが3文字と認識されてしまう点です。

そこで文字列の長さを求める関数を以下のように変えました。

int strlength(char s[])
{
int len = 0;
while(*s++){
if(*s!='!'&&*s!='?'&&*s!=','&&*s!='.'&&*s!=';'&&*s!=':'&&*s!='['&&*s!='\'')
len++;
}
return len;
}

「!」や「?」などは認識されなくなったのですが、「[」と「'」だけまだ認識されてしまいます。どこがいけないのでしょうか?

また、
i = scanf("%s", s);
でなぜ単語単位で格納されるのか、iには何が格納されるのかも知りたいです。

長文すみませんでした。詳しい方よろしくお願いします。

閲覧数:
37
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

dia********さん

2019/7/818:02:43

ミスその1

while(*s++){
if(*s!='!'&&*s!='?'&&*s!=','&&*s!='.'&&*s!=';'&&*s!=':'&&*s!='['&&*s!='\'')



①*sはnullか?

のあと

s++しているので

*null判断の1文字先の文字を判断している。


ミスその2

void wordsort(struct tango c[], int n)
{
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if(c[j].count > c[j+1].count){←ここ
struct tango tmp;

cはn個(0~n-1)存在するので


ここはcのn個目とn+1個目の比較を行っている。


まずは、これだけ。

  • 質問者

    ko_********さん

    2019/7/900:48:51

    while(*s++){
    if(*s!='!'&&*s!='?'&&*s!=','&&*s!='.'&&*s!=';'&&*s!=':'&&*s!='['&&*s!='\'')



    ①*sはnullか?

    のあと

    s++しているので

    *null判断の1文字先の文字を判断している。

    ①についてですが、*sがnull判断された場合次の文字に進まずwhile文が終了するのではないのでしょうか?

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる