ページ 11

C言語 単語の抽出

Posted: 2016年12月11日(日) 16:56
by Roy
ターミナルでテキストファイルから英単語を取り出すプログラムを作っています。記号などは無視し、アルファベットと数字の時のみ配列にしまうようにしています。

コード:

#include<stdio.h>
#include<string.h>
#include<ctype.h>

void GetWord(char *word){
  int  ch;
  int  cnt = 0;
  char word_buff[20] = {0};

  while(1){
    ch = getchar();
    if((isalnum(ch)) == 0)
      break;
    word_buff[cnt] = ch;
    cnt++;
  }

  strcpy(word,word_buff);

}

int main(){
  char word[20];

  for(int i = 0; i < 10; i++){
    GetWord(word);
    printf("%s\n", word);
    for(int j = 0; j < 20; j++)
      word[j] =	'\0';
  }

  return 0;
}
このコードだと記号などが二つ以上続くと謎の空白が入ってしまいます。以下が実行結果です。
[sp]はスペースのことです。

テキスト内容「test.[sp]te[sp]ttte[sp]000,000[sp][sp][sp][sp]hu[sp]ih」

[実行結果]
test

te
ttte
000
000



hu

原因が分かる方がいたら回答よろしくお願いします。

Re: C言語 単語の抽出

Posted: 2016年12月11日(日) 17:15
by みけCAT
その「謎の空白」は、0文字の単語が出力されているだけですね。

Re: C言語 単語の抽出

Posted: 2016年12月11日(日) 17:38
by Roy
回答ありがとうございます。その「0文字の単語」を無くすにはどうすればよいのでしょうか・・・?

Re: C言語 単語の抽出

Posted: 2016年12月11日(日) 20:21
by みけCAT
読み込んだ単語が0文字のときは返さないようにするといいでしょう。
出力する単語の数を固定しているのもよくないので、そこも含めて修正してみました。
► スポイラーを表示

Re: C言語 単語の抽出

Posted: 2016年12月11日(日) 22:25
by Roy
載せていただいたコードを試したところ、無事動作しました。ありがとうございました!

Re: C言語 単語の抽出

Posted: 2016年12月13日(火) 03:41
by かずま
Roy さんが書きました:載せていただいたコードを試したところ、無事動作しました。ありがとうございました!
このコードも試してみてください。

コード:

#include <stdio.h>
 
int main(void)
{
    char word[20];
 
    while (scanf("%*[^a-zA-Z0-9]"), scanf("%19[a-zA-Z0-9]", word) == 1)
        puts(word);
    return 0;
}