私は C およびシステム プログラミングの初心者です。宿題のために、stdin 構文解析行からの入力を単語に読み取り、System V メッセージ キューを使用して並べ替えサブプロセスに単語を送信するプログラムを作成する必要があります (単語のカウントなど)。入力部分で引っかかりました。入力を処理し、アルファベット以外の文字を削除し、すべてのアルファベットの単語を小文字にして、最後に単語の行を複数の単語に分割しようとしています。これまでのところ、すべてのアルファベットの単語を小文字で出力できますが、単語間に線があり、正しくないと思います。誰かが見て、私にいくつかの提案をしてもらえますか?
テキスト ファイルの例: The Project Gutenberg EBook of The Iliad of Homer, by Homer
正しい出力は次のようになるはずです。
the
project
gutenberg
ebook
of
the
iliad
of
homer
by
homer
しかし、私の出力は次のとおりです。
project
gutenberg
ebook
of
the
iliad
of
homer
<------There is a line there
by
homer
空行は「,」と「by」の間のスペースが原因だと思います。「if isspace(c)なら何もしない」とかやってみましたがだめでした。私のコードは以下です。任意のヘルプや提案をいただければ幸いです。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
//Main Function
int main (int argc, char **argv)
{
int c;
char *input = argv[1];
FILE *input_file;
input_file = fopen(input, "r");
if (input_file == 0)
{
//fopen returns 0, the NULL pointer, on failure
perror("Canot open input file\n");
exit(-1);
}
else
{
while ((c =fgetc(input_file)) != EOF )
{
//if it's an alpha, convert it to lower case
if (isalpha(c))
{
c = tolower(c);
putchar(c);
}
else if (isspace(c))
{
; //do nothing
}
else
{
c = '\n';
putchar(c);
}
}
}
fclose(input_file);
printf("\n");
return 0;
}
編集**
コードを編集したところ、最終的に正しい出力が得られました。
int main (int argc, char **argv)
{
int c;
char *input = argv[1];
FILE *input_file;
input_file = fopen(input, "r");
if (input_file == 0)
{
//fopen returns 0, the NULL pointer, on failure
perror("Canot open input file\n");
exit(-1);
}
else
{
int found_word = 0;
while ((c =fgetc(input_file)) != EOF )
{
//if it's an alpha, convert it to lower case
if (isalpha(c))
{
found_word = 1;
c = tolower(c);
putchar(c);
}
else {
if (found_word) {
putchar('\n');
found_word=0;
}
}
}
}
fclose(input_file);
printf("\n");
return 0;
}