
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を探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
C言語 逆ピラミッドの作り方
-
fgets関数とscanfについて
-
scanf関数について
-
数字以外が入力されたらエラー...
-
Eclipseコンソール表示を、リセ...
-
java初心者です。入力されたの...
-
電卓の小数点
-
"scanf"でエンターで改行させな...
-
VB カウントダウンタイマーの作...
-
Processingでのキーの同時入力
-
VisualStudio2019のコードアナ...
-
入力値が1以下、かつ数字以外の...
-
プログラミング python
-
C言語の文字列の長さを計算し表...
-
プログラムC言語の整数の約数に...
-
プログラムの進行が一時ストッ...
-
C言語scanf_sで何故か2回入力に...
-
VBでの日付入力値のフォーマッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
プログラミング初心者です。 Py...
-
C言語でgetchar();が上手く使え...
-
Excel VBAで、Application.Inpu...
-
電卓の小数点
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
小数か整数かを判定する方法
-
至急教えてください!プログラ...
-
getchar()について 教えてくだ...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
コマンドプロンプトからのEOFの...
-
IF文で戻ることはできますか?...
-
プログラミングの問題です 「金...
おすすめ情報