重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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件)

できるだけ質問者の書いたコードに添って書けば,以下のようになるか。


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);/*書式を決めてやらないと*/

}
    • good
    • 0

すでにいろいろ答えが出ていますが。



>自分なりに書きましたが動きません><

質問するときは、どんな風に「動かなかった」のか、どんな風に自分の予想と違っているのか、書くようにしましょう。
それを分析するのも、上達のポイントです。うまくいけば、質問するまでもなく自己解決できます。

デバッガを使ったり、printf等で途中経過を表示させたりして、プログラムの流れや変数の中身が自分の予想通りなのか、違うならどう違うのか、どう直したらよいのか、そういったことを考えていけば、自然とプログラムへの理解も深まるというものです。

例えば、今回ので言えば
・1回も数値入力無く終わることがある
→ループ条件があやしい
→indatの初期値はなんだろう→いつもバラバラ→初期化が必要
あるいは
→1回目は必ずループを通るようにする方法は無いだろうか→do~whileループを使う

・最終結果がおかしい
→どの段階でおかしくなっているか、途中経過を表示
→毎回、スペースが入らない→スペースを追加するにはどうするか
あるいは
→最後に入力した負の値まで連結される→負の値のときに連結しないようにするには?

といた具合に、解決策のヒントがみつかる筈です。




あとは、細かいツッコミになりますが

>使える標準関数は、
>sprintf関数と、strlen関数です。

これでは、scanfとprintfが使えません。
    • good
    • 0

>自分なりに書きましたが動きません><



#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()の戻り値が何を戻すのか調べてみて検討してみましょう。
    • good
    • 0

C言語のプログラミングでは変数の初期化とメモリ外への参照に十分注意して下さい。



記載されているプログラムでは
・No.1さんが書かれているとおりindatの初期化がありません。
・outbufが初期化されていないのでstrlenで正しい値が戻る保証がありません
 → 配列の初期化を勉強して下さい
・スペースをいれる記述がありません
 → "%d "では最後「0」の後ろにスペースが入るため一工夫必要かと思います

---------------
問題では重視されないかもしれませんが
・outbufの領域外への書き込みを防ぐ処理がありません
    • good
    • 0

>int indat,i;



定義した時点で何が入っているかわからない状態の変数を、

>while(indat >= 0)

0以上であると決めつけることはできません。
    • good
    • 0

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

今、見られている記事はコレ!