
学校で文字列のプログラムを組む課題が出ました 以下のような課題です
1つの文字列を読み込んで,ピリオドで改行し出力するプログラムを作成しろ
・読み込む文字列の長さ 最大で80文字
・文字列の終わりは必ずピリオドで
・文字列の途中に現れるピリオドの次には必ずスペースが続く
・ピリオドに続くスペースは出力しない
例えば
Hello. It is fine. Good-bye. と打つと
Hello.
It is fine.
Good-bye.
と表示されるようなプログラムです
そして自分で以下のプログラムを組みました
-----------------------------------------------------------
#include <stdio.h>
#include <string.h>
int main(void){
int i;
char A[100];
char *a;
fgets(A,80,stdin);
a = strtok(A, ".");
printf("%s.\n",a);
while(a != NULL){
a = strtok(NULL,".");
if (a != NULL){
printf("%s.\n",a);
}
}
return 0;
}
---------------------------------------------------------------
ですがこれだとピリオドの後のスペースと文字列の後によくわからない改行が出力されてしまいます
自分で何とかするべきなのでしょうがどうにもうまく行きません
どこをどうすればいいのか教えていただけないでしょうか?
No.3ベストアンサー
- 回答日時:
先ず、改行についてですが、fgets で文字列を取得すると、
入力するときの改行も含めて読み込まれます。
標準入力からの読込であれば、gets を使っても良いのでは?
"abc. cde" をstrtok で切り分けた場合、
"abc." と、" cde" に切り分けられるので、
2番目以降の出力の際には、スペース一文字分を考慮する
必要がありますね。
printf("%s.\n", a+1);
でいいんじゃないかな?
回答ありがとうございます
そのようにしてみるとうまくいきました
解説もとてもわかりやすくてありがたかったです
本当にありがとうございました
No.5
- 回答日時:
解決したいことは、
1. 「.」直後の空白を削除したい(区切り後先頭に来る空白)
2. 最後の出力で出力される余計な改行を削除したい
基本的なコーディングは間違えていないという感じなので
ヒントだけ。
「1.」 は どうしてもstrtok()つかいたい場合は、aのアドレスを移動させてみるとかどうでしょう。
# 個人的には strtok_r()の方がおすすめです。
「2.」は stdinで読み込んだ段階でキー入力時の改行が追加されています。
はじめてstrtok()する前にA[ strlen(A)-1 ] = '\0'; みたいな感じで 最後の \r\nを削除してあげればいいんじゃないですかね。
質問の内容を読み間違えていたらわすれてください(笑
回答ありがとうございます
直したいところを的確に答えていただいてとてもわかりやすかったです
strtok_r()など色々勉強になりました
本当にありがとうございました
3番のかたのほうが回答がはやかったためそちらをベストアンサーにさせていただきます
すいません
No.4
- 回答日時:
このsiteでは「プログラムを丸ごと教えてください。
」というのがよくありますが、その点あなたは自分のプログラムを書いて、それについて悩んでいるのは立派だと
思います。
プログラムが意図通りに動かない場合に、その原因を突き止めて修正する作業を
「デバッグ」と言います。プログラムを作るには、「設計」、「コーディング」、
「テスト」、「デバッグ」などの行程が必要になりますが、このデバッグにかかる
時間は設計よりも長くなったりもします。また、しっかりしたテストを行って
その結果からデバッグを効率的に行うことがプログラム作成には必要です。
今、あなたはテストを行ってバグ(問題点)を見つけたので、あとはデバッグを
行う技術を身につければ良いのです。
例えばプリント文を printf("[%s].\n",a); としてみてください。strtok
で切り出された文字列が[ ] に挟まれて表示されるので、これを見て自分が
予想していた結果と同じかどうかを検討すればデバッグはできるハズです。
頑張ってください。
回答ありがとうございます
まだプログラミングを始めたばかりなのであなたの回答は
とても参考になりました
これからも頑張ろうと思います
本当にありがとうございました
できれば3番の方とあなたをベストアンサーにしたのですが
3番の方の回答のほうが早く、この質問にはあっていると思ったので
3番の方をベストアンサーとさせていただきます
すいません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 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# str[j++]の意味 2 2022/08/30 16:20
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
str[j++]の意味
-
sscanfとscanfの違いがよくわか...
-
1行の文字列を時間差で表示する...
-
strstrを利用しない文字列検索...
-
charと%c , %s の関係について
-
CStringのFindで文字列検索を行...
-
【続】コマンドライン引数を使...
-
fgetsでバッファ残留文字列を無...
-
反転した数値を表示させるやり方
-
文字の入れ替えについて
-
Enterキーを押されたら次の処理...
-
「Aに対するBの割合」と「Aに対...
-
複数桁10進数の*桁目だけを抽出...
-
float と double
-
float型とdouble型の変数の違い...
-
[C++]メンバ関数の仮引数について
-
Aの値からBの値を除するとは??
-
関数の呼び出し
-
プログラム、どのように書いて...
-
「指定されたキャストは有効で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
fgetsで拾われる改行文字を削除...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
Cで「大文字、小文字の判定」は...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
C++
-
C/C++言語で日本語処理
-
C言語 空白の行(改行のみ)が...
-
CStringについて
-
小文字のみを数える方法
-
教えていただけませんか?C言語...
-
ブランクのチェック
-
str[j++]の意味
-
初歩的なプログラムなんですが...
おすすめ情報