こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の問題がわかりません。

C言語の問題がわかりません。
ファイルを読み込んで、文字数と単語数を数えるプログラムなのですが、
例えば、ファイルが
「I was born in Japan
 I like baseball」でしたら、

1:I was born in Japan
19文字、5単語
2:I like baseball
15文字、3単語

と表示したいのですが、下記のプログラムのままだと、

1:I was born in Japan

20文字、5単語
2:I like baseball
15文字、3単語

と作った文章の改行の部分を認証してしまいます。
改行の部分を認証しないようにこれを修正するにはどうしたらいいでしょうか?

また、もう一つあるのですが、結果の文章を

1:napaJ・・・
2:・・・ekil I

と行ごとに逆に表示したいのですが、どうすれば逆に表示できますでしょうか?

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

int main(void) {
FILE *fin;
char filename[20];
char data[256], *abc;
int a,b,n;

printf("ファイル名の入力 :");
scanf("%s", filename);

fin=fopen(filename,"r");
if(fin == NULL){
printf("%sがオープンできません!\n",filename);
exit(1);
}
a=0;
b=0;
n=0;
while(fgets(data,256,fin) != NULL) {
a=a+1;
b=strlen(data);
abc = data;
*(abc - 2) = '\t';
while (*abc == ' ') {abc++;}
while (*abc != '\0') {
while (*abc != '\0' && !(*abc == ' ' || *abc == '\t' || *abc == ',' || *abc == '.')){abc++;}
n = n+1;
while (*abc != '\0' && (*abc == ' ' || *abc == '\t' || *abc == ',' || *abc == '.')) {abc++;}
}
printf("%d:%s\n",a,data);
printf("%d文字、%d単語\n",b,n);
n=0;
}
fclose(fin);

return 0;
}

投稿日時 - 2010-01-27 16:38:04

QNo.5627577

困ってます

質問者が選んだベストアンサー

1. 改行をけずればいいのかな?
chomp はないので自分で作るしかないですかねぇ
if( strlen(data) > 0 )
{
if( data[ strlen(data)-1 ] == '\n' ) data[ strlen(data)-1 ] = '\0';
if( data[ strlen(data)-1 ] == '\r' ) data[ strlen(data)-1 ] = '\0';
}

2. for()で start とend を入れ替えればよいです。
for( int s=strlen(data); s>0; s--) data[s];

# ところでこの場合、 strspn()じゃなくて strpbrk() じゃないかと
おもってみたり

投稿日時 - 2010-01-28 00:14:20

お礼

ありがとうございます!1つ目の構成が上手くできなかったので助かります。

投稿日時 - 2010-01-29 22:36:16

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

> data[b](末尾)

data[b - 1](末尾)
でした。すみません。

投稿日時 - 2010-01-27 17:03:31

ANo.1

とりあえずstrspn()とかstrcspn()とか憶えると幸せになれるかと思います。
それはさておき、一つ目はdata[b](末尾)が'\n'なら'\0'に置き換えてbを減らせばいいでしょう。
二つ目はfor(かwhile)とputcharの組み合わせでどうぞ。

投稿日時 - 2010-01-27 17:02:21

お礼

ありがとうございます。1つ目自分の知識が足りず、上手く構成できなかったのですが、とても参考になりました。

投稿日時 - 2010-01-29 22:34:45

あなたにオススメの質問