
C言語の標準関数についての質問です><
実行結果が以下のようになるようにプログラムを作りたいのですが・・・・
int indat; ← 用意された変数です。
static char outbuf[101]; ←用意された変数です。
使える標準関数は、
sprintf関数と、strlen関数です。
実行結果
数値入力==>123
数値入力==>45
数値入力==>6789
数値入力==>0
数値入力==>-1
文字列連結=123△45△6789△0
自分なりに書きましたが動きません><
#include <stdio.h>
#include <string.h>
void main(void)
{
int indat,i;
static char outbuf[101];
i=0;
while(indat >= 0)
{
printf("数値入力==>");
scanf("%d",&indat);
sprintf(&outbuf[i],"%d",indat);
i=strlen(outbuf);
}
printf("文字列連結",outbuf);
return;
}
表示の△は空白です><
どなたか、プログラムを教えてください><
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
できるだけ質問者の書いたコードに添って書けば,以下のようになるか。
scanfなどを何回か使うことになる。したがって,他の回答者を参考にどうぞ。
strlenは使わないですむが,使ってもかまわないでしょう。
想定外の入力などに対する対策は考えていないので,適切に設定してください。
#include <stdio.h>
#include <string.h>
void main(void)
{
int indat,i;
static char outbuf[101]={0};/*配列の初期化*/
i=0;
indat=0;/*初期化ね*/
printf("数値入力==>");
scanf("%d",&indat);/*-1を連結されないように,ここに1つ*/
while(indat >= 0)
{
i+=sprintf(&outbuf[i],"%d",indat);
//i=strlen(outbuf);
printf("数値入力==>");
scanf("%d",&indat);/*ここにもう1つ*/
if(indat!=-1)
i+=sprintf(&outbuf[i],"%c",' ');/*区切りのスペース*/
//i=strlen(outbuf);
}
printf("文字列連結 %s\n",outbuf);/*書式を決めてやらないと*/
}
No.4
- 回答日時:
すでにいろいろ答えが出ていますが。
>自分なりに書きましたが動きません><
質問するときは、どんな風に「動かなかった」のか、どんな風に自分の予想と違っているのか、書くようにしましょう。
それを分析するのも、上達のポイントです。うまくいけば、質問するまでもなく自己解決できます。
デバッガを使ったり、printf等で途中経過を表示させたりして、プログラムの流れや変数の中身が自分の予想通りなのか、違うならどう違うのか、どう直したらよいのか、そういったことを考えていけば、自然とプログラムへの理解も深まるというものです。
例えば、今回ので言えば
・1回も数値入力無く終わることがある
→ループ条件があやしい
→indatの初期値はなんだろう→いつもバラバラ→初期化が必要
あるいは
→1回目は必ずループを通るようにする方法は無いだろうか→do~whileループを使う
・最終結果がおかしい
→どの段階でおかしくなっているか、途中経過を表示
→毎回、スペースが入らない→スペースを追加するにはどうするか
あるいは
→最後に入力した負の値まで連結される→負の値のときに連結しないようにするには?
といた具合に、解決策のヒントがみつかる筈です。
あとは、細かいツッコミになりますが
>使える標準関数は、
>sprintf関数と、strlen関数です。
これでは、scanfとprintfが使えません。
No.3
- 回答日時:
>自分なりに書きましたが動きません><
#1のasuncionさんの指摘どうりです。
要点を2つほど
(1)入力はdo while文を使用する
これはもう30年前のUNIXの普及当時からの固定パターンです。
do {
入力処理
} while(判定処理);
scanf()については
do {
if((cont = scanf(・・・)) == EOF)
// ファイルの終端(ctrl+Z)に達した場合の処理
} while(cont != n); // nは変換に成功した数
という定型のパターンがあります。あるいはこの応用。
この場合は、入力の終了の判定がありますからdo while文を2重にします。
do {
// scanf()の入力処理のループ
// バッファへの書き込み処理(終了コードでループ抜け)
} while(バッファの空き容量のチェック);
(2)strlen()の処理
strlen()を使用する必要があるかどうか、sprintf()の戻り値が何を戻すのか調べてみて検討してみましょう。
No.2
- 回答日時:
C言語のプログラミングでは変数の初期化とメモリ外への参照に十分注意して下さい。
記載されているプログラムでは
・No.1さんが書かれているとおりindatの初期化がありません。
・outbufが初期化されていないのでstrlenで正しい値が戻る保証がありません
→ 配列の初期化を勉強して下さい
・スペースをいれる記述がありません
→ "%d "では最後「0」の後ろにスペースが入るため一工夫必要かと思います
---------------
問題では重視されないかもしれませんが
・outbufの領域外への書き込みを防ぐ処理がありません
No.1
- 回答日時:
>int indat,i;
定義した時点で何が入っているかわからない状態の変数を、
>while(indat >= 0)
0以上であると決めつけることはできません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
cout関数を使っているのですが...
-
java初心者です。入力されたの...
-
ワードで文字を入力する時の変...
-
C言語(構造体)
-
C言語初心者です。ファイルの読...
-
C言語について
-
EDITコントロールで入力できる...
-
4桁の数字以外を入力したらエラ...
-
コマンドプロンプトからのEOFの...
-
EXCEL VBA での、正規表現のパ...
-
"scanf"でエンターで改行させな...
-
getchar()について 教えてくだ...
-
正負を反転させて出力するプロ...
-
C言語の整数の判別
-
入力候補を表示させるには・・・?
-
入力値が1以下、かつ数字以外の...
-
C言語の勉強しています。すみま...
-
scanfでの可変引数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
scanfが2回使えない・・・?;
-
Excel VBAで、Application.Inpu...
-
"scanf"でエンターで改行させな...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
プログラミングの問題です 「金...
-
if文の条件にscanf関数を使うと…?
-
C言語でgetchar();が上手く使え...
-
UWSCで変数をキー入力
-
4桁の数字以外を入力したらエラ...
-
EDITコントロールで入力できる...
-
C言語でつるかめ算をするにはど...
-
Userformの入力順序をタブオー...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報