
学校で文字列のプログラムを組む課題が出ました 以下のような課題です
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
fgetsで拾われる改行文字を削除...
-
C言語のステップ数をカウントす...
-
fgets関数を使用したときの文字...
-
CStringについて
-
sscanfとscanfの違いがよくわか...
-
if文の判定条件('||'と'&&'の使...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
c languageで 簡単な質問があ...
-
エクセルで可視セルにのみ値貼...
-
20'(角度)の計算がわかりま...
-
scanfの入力をgets関数で読み捨...
-
マイナスからプラスへ転じた時...
-
値差の%計算方法について
-
「Aに対するBの割合」と「Aに対...
-
gcc: incompatible pointer type
-
「指定されたキャストは有効で...
-
CStringをwchar_tに変換したい
-
return 1L
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
fgetsで拾われる改行文字を削除...
-
fgets関数を使用したときの文字...
-
Cで「大文字、小文字の判定」は...
-
反転した数値を表示させるやり方
-
C言語 空白の行(改行のみ)が...
-
itoaわかりません
-
C言語のステップ数をカウントす...
-
charと%c , %s の関係について
-
文字列の途中に「0」がある場...
-
C言語の勉強しています。すみま...
-
putsとputcharの違い?
-
fgetsとsscanfを使って一行から...
-
単語数のカウントについて
-
C/C++言語で日本語処理
-
CStringについて
-
C言語で16進数文字列から16進数...
-
printfの引数指定でなぜ文字列...
-
C言語(ポインタ)について
おすすめ情報