アプリ版:「スタンプのみでお礼する」機能のリリースについて

学校で文字列のプログラムを組む課題が出ました 以下のような課題です

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;

}
---------------------------------------------------------------

ですがこれだとピリオドの後のスペースと文字列の後によくわからない改行が出力されてしまいます

自分で何とかするべきなのでしょうがどうにもうまく行きません
どこをどうすればいいのか教えていただけないでしょうか?

A 回答 (5件)

先ず、改行についてですが、fgets で文字列を取得すると、


入力するときの改行も含めて読み込まれます。
標準入力からの読込であれば、gets を使っても良いのでは?

"abc. cde" をstrtok で切り分けた場合、
"abc." と、" cde" に切り分けられるので、
2番目以降の出力の際には、スペース一文字分を考慮する
必要がありますね。

printf("%s.\n", a+1);

でいいんじゃないかな?
    • good
    • 0
この回答へのお礼

回答ありがとうございます

そのようにしてみるとうまくいきました
解説もとてもわかりやすくてありがたかったです

本当にありがとうございました

お礼日時:2011/01/01 23:38

解決したいことは、


1. 「.」直後の空白を削除したい(区切り後先頭に来る空白)
2. 最後の出力で出力される余計な改行を削除したい

基本的なコーディングは間違えていないという感じなので
ヒントだけ。

「1.」 は どうしてもstrtok()つかいたい場合は、aのアドレスを移動させてみるとかどうでしょう。
# 個人的には strtok_r()の方がおすすめです。

「2.」は stdinで読み込んだ段階でキー入力時の改行が追加されています。
はじめてstrtok()する前にA[ strlen(A)-1 ] = '\0'; みたいな感じで 最後の \r\nを削除してあげればいいんじゃないですかね。

質問の内容を読み間違えていたらわすれてください(笑
    • good
    • 0
この回答へのお礼

回答ありがとうございます

直したいところを的確に答えていただいてとてもわかりやすかったです
strtok_r()など色々勉強になりました

本当にありがとうございました


3番のかたのほうが回答がはやかったためそちらをベストアンサーにさせていただきます
すいません

お礼日時:2011/01/01 23:59

このsiteでは「プログラムを丸ごと教えてください。

」というのがよくありますが、
その点あなたは自分のプログラムを書いて、それについて悩んでいるのは立派だと
思います。

プログラムが意図通りに動かない場合に、その原因を突き止めて修正する作業を
「デバッグ」と言います。プログラムを作るには、「設計」、「コーディング」、
「テスト」、「デバッグ」などの行程が必要になりますが、このデバッグにかかる
時間は設計よりも長くなったりもします。また、しっかりしたテストを行って
その結果からデバッグを効率的に行うことがプログラム作成には必要です。

今、あなたはテストを行ってバグ(問題点)を見つけたので、あとはデバッグを
行う技術を身につければ良いのです。
例えばプリント文を printf("[%s].\n",a); としてみてください。strtok
で切り出された文字列が[ ] に挟まれて表示されるので、これを見て自分が
予想していた結果と同じかどうかを検討すればデバッグはできるハズです。

頑張ってください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

まだプログラミングを始めたばかりなのであなたの回答は
とても参考になりました

これからも頑張ろうと思います
本当にありがとうございました

できれば3番の方とあなたをベストアンサーにしたのですが
3番の方の回答のほうが早く、この質問にはあっていると思ったので
3番の方をベストアンサーとさせていただきます
すいません

お礼日時:2011/01/01 23:50

strtokなんていう、微妙なふるまいをする関数を使わなくても、



1文字読む
.(ピリオド)でなければ、そのまま出力する
ピリオドならば、改行を出力して1文字読み飛ばす

でじゅうぶんかと。
    • good
    • 0
この回答へのお礼

迅速に答えていただきありがとうございます

そうですね
strokを使ったほうが簡単そうだったので使ってみたのですが
失敗だったのかもしれません

そのやり方でも考えてみることにします
回答ありがとうございました

お礼日時:2011/01/01 21:46

ぱっと見、ピリオドではなく、スペースで区切ると思うので、


>a = strtok(A, ".");
じゃなくて、
a = strtok(A, " ");
ではないですか?
    • good
    • 0
この回答へのお礼

すぐに回答していただきありがとうございます

そのようにしてみたのですがうまくいきませんでした

回答ありがとうございました

お礼日時:2011/01/01 21:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!