一週間で身につくC言語というサイトでC言語の勉強をしています。
http://c-lang.sevendays-study.com/problemex4.html
上記URLのprobex7-6.
以下の、nums.txtには、,(コンマ)で区切られた英単語が入っている。この単語のなかから、"a"で始まる文字列のみを表示し、その数も出力しなさい。
「nums.txt」の内容
apple,orange,angel,lucky
「実行結果」
aから始まる単語
apple
angel
----------
個数:2
この問題がわかりません。。。
今、私が考えているのは、nums.txtにある文字列をそれぞれ配列に格納して
aから始まる単語を読み取るやり方です。
mallocで配列を確保して代入したいのですが、どうもうまく動きません。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 256
void main()
{
FILE* file;
errno_t err;
char line[SIZE];
char* pt = NULL;
int c, i;
err = fopen_s(&file, "C:\\test\\write.txt", "r");
if (err != 0)
{
printf("ファイルが開けません\n");
exit(1);
}
while ((c = fgetc(file)) != EOF)
{
if (c == ',')
{
printf("\n");
}
else
{
pt = (char*)malloc(sizeof(char)*SIZE);
for (i = 0; i < SIZE; i++) {
pt[i] = (char)c;
}
for(i=0;i<SIZE;i++){
printf("%c", pt[i]);
}
}
free(pt);
printf("\n");
}
}
「実行結果」
aaaaaa......a (256個)
ppppp.....p(256個)
ppppp.....p(256個)
llllllll.....l(256個)
eeeee....e(256個)
↑このようにappleの文字がそれぞれ256個表示されるようになってしまいました。
ご教授ください。
No.4
- 回答日時:
いつfgetc(file)を実行しているのでしょうか。
while()のループ前の判定時に実行していますね。
cの値を呼び出すたびにfgetc()を実行しているわけではないのでwhile(){}の中にあるforループを動かしている間はcの値は変化しません。
せっかくline[]なる配列を作ったのですから、いったんwhileループの先頭で","までの文字列をline[]に格納してから(","が出たらヌル文字\0で終端しておくとprintf("%s",line)で文字列を出力できます)、後の処理に回しましょう。
No.3ベストアンサー
- 回答日時:
1もじずつ読み込み、lineにためて行きます。
読み込んだ1文字が改行かカンマなら、その文字を\0に変えて、lineの
内容を印字します。lineの先頭の1文字が'a'ならaのカウンターに1加算します。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 256
void main()
{
FILE *file;
errno_t err;
char line[SIZE];
char *pt = NULL;
int c, i;
int a_ctr;
err = fopen_s(&file, "C:\\test\\write.txt", "r");
if (err != 0) {
printf("ファイルが開けません\n");
exit(1);
}
i = 0;
a_ctr = 0;
while ((c = fgetc(file)) != EOF) {
line[i] = c;
i++;
if (c == ',' || c=='\n') {
line[i-1] = '\0';
printf("%s\n",line);
if (line[0] == 'a'){
a_ctr++;
}
i = 0;
}
}
printf("aで始まる単語の数は%d個\n",a_ctr);
}
No.2
- 回答日時:
このような場合は状態遷移を整理することをお勧めします。
https://ja.wikipedia.org/wiki/%E7%8A%B6%E6%85%8B …
本件の状態遷移ならば、以下が考えられます。
〇 内部状態
状態1 : 単語の読取前 (初期状態)
状態2 : A単語の読取中
状態3 : 他単語の読捨中
状態4 : 入力終了
〇 状態遷移
状態1 → 状態2 // 'a' が入力された
状態1 → 状態3 // 'a' 以外が入力された
状態2 → 状態1 // カンマが入力された
状態2 → 状態2 // その他が入力された
状態3 → 状態1 // カンマが入力された
状態3 → 状態3 // その他が入力された
全状態 → 状態4 // EOF が入力された
〇 遷移に伴う動作
状態1 → 状態2 // 入力文字をそのまま出力, 個数の変数を加算
状態2 → 状態2 // 入力文字をそのまま出力
状態2 → 状態2以外 // 単語区切りのために改行を出力
全状態 → 状態4 // 個数の報告行を出力
状態遷移が整理できたら、以下のように実装しましょう。
int mode = 1; // 状態の初期値
int aword = 0;
while (true) {
_ c = fgetc(file);
_ if (c == EOF) {
_ _ if (mode == 2) putchar('\n'); // 状態2→4 の遷移に伴う動作
_ _ break; // 状態4 をループ終了で表現
_ }
_ switch (mode) {
_ case 1:
_ _ if (c == 'a') { // 状態1でaが入力された
_ _ _ mode = 2; // 遷移先の状態
_ _ _ aword++; putchar(c); // 遷移に伴う動作
_ _ } else ...
_ _ break;
_ case 2: ...
_ case 3: ...
_ }
}
printf("%d\n", aword);
No.1
- 回答日時:
cが','以外の時は、else以下free(pt);printf("\n");までのところがまとめて実行されるので、実行結果がそうなるのは当然かと。
どのタイミングでmallocを実行して、どのようにpt[i]に代入して、どの条件で内容をprintfし、どのタイミングでfreeを実行するか、をきちんと考えることからですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
Eclipseコンソール表示を、リセ...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
C言語について
-
プログラミングC言語について
-
cout関数を使っているのですが...
-
C言語でつるかめ算をするにはど...
-
switch文 defaultについて
-
至急教えてください!プログラ...
-
java初心者です。入力されたの...
-
Userformの入力順序をタブオー...
-
WindowsでEOF
-
C言語
-
MinGWのC言語でCTRL+Zで処理が...
-
C言語scanf_sで何故か2回入力に...
-
C++のcinの動作
-
プログラムの進行が一時ストッ...
-
漢字のソートについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報