このコードは、インプットの例が "aabbc"のとき
a2b2c1とアウトプットするためのものです。(各単語の数を数える)
しかし、argv[1][i]とは別に、char*をmallocしなくてはいけなく、
また、インプットよりアウトプットの文字数が長くなった場合は、インプットされた文字列を出力するという制限があります。
そのため、毎回 printf("%c",pointer_list[num]);と、 printf("%d",pointer_list[num]); を交互に出力することはできず、int 型と、char型を混ぜてchar *pointer_listに保存しています。
最終的にこのpointer_listをfor loopで全部出力するときには、%d と %cが混合してるため、sprintf(pointer_list, "%c%d", pointer_list[i],pointer_list[i+1]);
とのように表示しようとしたのですが何も出力されませんでした。
アドバイスいただきたいです。どうかよろしくお願いします。
C
1 2int valu=0;//数字を示す 3int num=0; //リストの何番目かを示す 4char *pointer_list=malloc(sizeof(char)*size); 5 6pointer_list[num]=argv[1][i-1];//charのアルファベットを示す。 7num++; 8valu++; 9pointer_list[num]=value; 10
charの配列の要素にintの値を入れようとしても、charのサイズに切り捨てられます。(intを32ビット、charを8ビットとして、8ビットに切り捨て)
> int_valu++;
> pointer_list[num]=value;
ですので、そもそもやりたいことの前提にそぐわないと思います。
sprintf()で、int と charをまとめてstring にするということになりますか?
ゴールは「a2b2c1とアウトプットする」だけでしょうか? もしそうなら、pointer_listは必要ありません。
課題で、list をmalloc して、sprintf()を使えと指定されています。
なるほど。題名のように、char*[]を1つ使うことが条件なんですかね。
charの配列でも、ポインタを使って値をストアするときに(int*)でキャストすればint型の値を押し込むことはできます。そういう操作を求める課題なのですかね。最初に求めるサイズを正確に計算するには面倒そうですが。
それが、char[ ]だけだと、%d %cの
char *pointer_list=malloc(sizeof(char)*size);
snprintf(pointer_list, 2, "%s%d", argv[1][i-1],value);
//pointer_list[num]=argv[1][i-1];//charのアルファベットを示す。<----これはsnprintfで置き換えられる
num++;
int_value++;
pointer_list[num]=value;<---これも置き換えられる
しかしながら、これだと、char*[ ]を何個も用意する(char[ ][ ]) 必要ができくると思うのですが、クラスメイトは、char*だけを使った。と言っていて混乱しています。
依然として制約があいまいなので、課題の文章を正確に書いたほうがよいです。
話もイミフなら示すコードも断片すぎて全くイミフ.
何で全体を示さないの?
抜粋するにしても「ループがどうのこうの」とか言うなら,少なくともループを含む形で示そうとか思わないの? 何なの?
size って何? 誰が値をどう決めるの?
int_valu って何? 何のために必要なの? num との違いは何なの?
タイトルに出てくる char*[ ] と話の内容のつながりはどこにあるの?
> 各単語の数を数える
「単語」とは何か? 実際には個々のアルファベットの数を数える?
入力が "abaaaaa" に対応する出力は "a6b1" なのか,それとも "a1b1a5" なのか,その他なのか?
仮に前者だとして,"b1a6" でも正解なのか?
まず大前提として、学校の課題は非推奨質問です。
[1-1. teratailはサポートセンターではなく、思考するエンジニアの為のQ&Aコミュニティです]
https://teratail.com/help/question-tips#questionTips1
> teratailを「サポートセンター」だとは思わないでください。
> 作業依頼のような投稿をして、課題や仕事を無償でやってもらえる場ではありません。
> あなたがそのようなつもりで質問しているのだと他のユーザーから誤解されないように、丁寧な質問を心がけましょう。
https://teratail.com/help/avoid-asking
> コードをください・デバッグしてください等の丸投げの質問
> 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
そもそも、学校の先生に聞けば良いのではないでしょうか?
生徒の学習理解度や授業でどの程度教えてるか把握している筈なので、適切なアドバイスが貰えるでしょう。このサイトで回答するような人は仕事でバリバリ各言語を使っている人なので、学校で習っていない手法で回答されたり、という事も当然あります。そういった回答を課題で提出されたら、判る人はすぐ判るし、大学の厳しい教授とかなら、それで単位無くすとかも有り得ます。
ランレングスの仕様を完全に理解しないまま他人に説明している文のようです。
"単語"では無く"文字"でしょうし、長さ=数値=int という思い込み、ポインタ=配列とポインタ="*" の混在等が絡まっているのではないでしょうか。
要するに「コマンドパラメータとして指定した文字列を"[文字,長さ]の組で表現する文字列"で表示しなさい。その際、結果文字列は malloc で獲得した領域に保存するようにし、元の文字列より長くなる場合は元の文字列を表示しなさい。」という感じの課題なのではないでしょうか。
まぁ課題ならば課題本文を見れば分かることですから、わざわざを解析・推測する必要はありませんけど。
入力が "aa556" の場合、"a25261" を出力するのでしょうか?
回答3件
あなたの回答
tips
プレビュー