質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1005閲覧

C言語で、char*[ ] に char とint の値を交互に入れて、その後出力したい。

alizona

総合スコア126

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/10/12 00:03

編集2021/10/12 21:10

このコードは、インプットの例が "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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/12 00:09

charの配列の要素にintの値を入れようとしても、charのサイズに切り捨てられます。(intを32ビット、charを8ビットとして、8ビットに切り捨て) > int_valu++; > pointer_list[num]=value; ですので、そもそもやりたいことの前提にそぐわないと思います。
alizona

2021/10/12 00:15

sprintf()で、int と charをまとめてstring にするということになりますか?
int32_t

2021/10/12 00:17

ゴールは「a2b2c1とアウトプットする」だけでしょうか? もしそうなら、pointer_listは必要ありません。
alizona

2021/10/12 00:21

課題で、list をmalloc して、sprintf()を使えと指定されています。
int32_t

2021/10/12 00:25

なるほど。題名のように、char*[]を1つ使うことが条件なんですかね。
dodox86

2021/10/12 00:30

charの配列でも、ポインタを使って値をストアするときに(int*)でキャストすればint型の値を押し込むことはできます。そういう操作を求める課題なのですかね。最初に求めるサイズを正確に計算するには面倒そうですが。
alizona

2021/10/12 00:32

それが、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;<---これも置き換えられる
alizona

2021/10/12 00:33

しかしながら、これだと、char*[ ]を何個も用意する(char[ ][ ]) 必要ができくると思うのですが、クラスメイトは、char*だけを使った。と言っていて混乱しています。
int32_t

2021/10/12 00:39

依然として制約があいまいなので、課題の文章を正確に書いたほうがよいです。
fana

2021/10/12 01:19

話もイミフなら示すコードも断片すぎて全くイミフ. 何で全体を示さないの? 抜粋するにしても「ループがどうのこうの」とか言うなら,少なくともループを含む形で示そうとか思わないの? 何なの? size って何? 誰が値をどう決めるの? int_valu って何? 何のために必要なの? num との違いは何なの? タイトルに出てくる char*[ ] と話の内容のつながりはどこにあるの?
fana

2021/10/12 01:52

> 各単語の数を数える 「単語」とは何か? 実際には個々のアルファベットの数を数える? 入力が "abaaaaa" に対応する出力は "a6b1" なのか,それとも "a1b1a5" なのか,その他なのか? 仮に前者だとして,"b1a6" でも正解なのか?
退会済みユーザー

退会済みユーザー

2021/10/12 02:14 編集

まず大前提として、学校の課題は非推奨質問です。 [1-1. teratailはサポートセンターではなく、思考するエンジニアの為のQ&Aコミュニティです] https://teratail.com/help/question-tips#questionTips1 > teratailを「サポートセンター」だとは思わないでください。 > 作業依頼のような投稿をして、課題や仕事を無償でやってもらえる場ではありません。 > あなたがそのようなつもりで質問しているのだと他のユーザーから誤解されないように、丁寧な質問を心がけましょう。 https://teratail.com/help/avoid-asking > ​コードをください・デバッグしてください等の丸投げの質問 > 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。 そもそも、学校の先生に聞けば良いのではないでしょうか? 生徒の学習理解度や授業でどの程度教えてるか把握している筈なので、適切なアドバイスが貰えるでしょう。このサイトで回答するような人は仕事でバリバリ各言語を使っている人なので、学校で習っていない手法で回答されたり、という事も当然あります。そういった回答を課題で提出されたら、判る人はすぐ判るし、大学の厳しい教授とかなら、それで単位無くすとかも有り得ます。
jimbe

2021/10/12 03:49 編集

ランレングスの仕様を完全に理解しないまま他人に説明している文のようです。 "単語"では無く"文字"でしょうし、長さ=数値=int という思い込み、ポインタ=配列とポインタ="*" の混在等が絡まっているのではないでしょうか。 要するに「コマンドパラメータとして指定した文字列を"[文字,長さ]の組で表現する文字列"で表示しなさい。その際、結果文字列は malloc で獲得した領域に保存するようにし、元の文字列より長くなる場合は元の文字列を表示しなさい。」という感じの課題なのではないでしょうか。 まぁ課題ならば課題本文を見れば分かることですから、わざわざを解析・推測する必要はありませんけど。
kazuma-s

2021/10/13 01:19

入力が "aa556" の場合、"a25261" を出力するのでしょうか?
guest

回答3

0

ベストアンサー

int 型と、char型を混ぜてchar *pointer_listに保存しています。

そんな奇妙なデータ構造を取らずに、snprintfなどで数値も文字列に変換して、文字数チェックをしながらメモリに積んでいってはどうでしょうか?

投稿2021/10/12 00:16

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alizona

2021/10/12 00:37

すみません。それが必要とわかってから char *pointer_list=malloc(sizeof(char)*size); int_value++; snprintf(pointer_list, 2, "%s%d", argv[1][i-1],value); のようにしようとしてるのですが、これをfor loopで回すので、char[ ] [ ]になってしまうのではないかと思っていて、どうすればいいのかがわかりません。文字列にしたら string+stringで繋げるということでしょうか? 都合の良いことに、文字は全て一文字ずつ交互なので、それでもいけそうな気がしてきました。
maisumakun

2021/10/12 00:39

> char[ ] [ ]になってしまうのではないか どういう意味ですか? (このコードでは、毎回pointer_listの先頭から書き直すので、結果は上書きされてしまいます)
alizona

2021/10/12 00:47

今思いついたのですが、%d, %cで合計2文字だけなので、 char[2] sublist= snprintf(pointer_list, 2, "%s%d", argv[1][i-1],value); にして、 pointer_list=pointer_list+sublist; でできますでしょうか?
maisumakun

2021/10/12 00:49

できません。C言語では、文字列の連結にも関数が必要ですし、char[2]に2文字入れると末端のヌル文字が入りません。
int32_t

2021/10/12 00:58

質問者さん、文字は10文字以上連続することはないのですか? そういう制約条件をちゃんと書かないと解決に辿り着けませんよ。
alizona

2021/10/12 00:58

そうなのですね。ありがとうございます。課題で指定されてる要件で見落としてるとこがないか確認してみます。グループチャットでもクラスメイトに質問したので、解決したら報告させていただきます。ありがとうございました。
alizona

2021/10/12 01:02

文字数は、メモリの限界まで対応できるようにと書いてあります。質問したコードの前で、%dと%cのペアをなんペアか数えるコードを書いたので、そこでmallocしました。
alizona

2021/10/12 21:12

sprintf() を使わないといけないということは、質問文に書き忘れました。追記の方のみに書いてありもしわけありませんでした。 char* だけをつかって  num+=sprintf(pointer_list+num,"%c%d",argv[1][i],value);
guest

0

おそらくはこのようなことかと思います。

※公式に提出するものとはしないでください。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int main(int argc, char* argv[]) { 6 char* input = "abbccc";//"abbcc";//"aaaaaaaaaa";//argv[1]; 7 int size = strlen(input); 8 char* output = (char*)malloc(size+1); 9 memset(output, '\0', size+1); 10 int j = 0; 11 for(int i=0; i<size && j<size; ) { 12 output[j++] = input[i]; 13 int k = 0; 14 for(char c=input[i]; k<9 && input[i]==c; k++, i++); 15 output[j++] = '0'+k; 16 } 17 printf(j <= size ? output : input); 18 free(output); 19 return 0; 20}

実行結果(input="abbccc" の場合)

plain

1a1b2c3

実行結果(input="abbcc" の場合)

plain

1abbcc

実行結果(input="aaaaaaaaaa" の場合) …仕様不明

plain

1a9a1

投稿2021/10/12 09:19

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alizona

2021/10/12 21:05

ありがとうございました。
guest

0

質問文の内容は話もコードも全く意味不明ですが,
とりあえず質問タイトルの

C言語で、char*[ ] に char とint の値を交互に入れて、その後出力したい。

という文言を無理矢理解釈するとこういう話になりそうです.

C

1//"char*[]" : 2// →これを「char*型の配列」と解釈 3char *Array_of_CharPointer[6]; 4 5//"char と int を交互に入れて" : 6// →sizeof(char*)がsizeof(int)以上なのだとすれば,まぁ値を突っ込むことは可能 7Array_of_CharPointer[0] = (char*)('C'); 8Array_of_CharPointer[1] = (char*)(3); 9Array_of_CharPointer[2] = (char*)('a'); 10Array_of_CharPointer[3] = (char*)(9); 11Array_of_CharPointer[4] = (char*)('t'); 12Array_of_CharPointer[5] = (char*)(8); 13 14//"その後出力" : 15// →何番目に何が入っているのか? が分かっているなら,書式指定子書けるよね. 16// ※コンパイラがブチギレたらキャストで黙らそう! 17printf( "%c %d\n", Array_of_CharPointer[0], Array_of_CharPointer[1] ); 18printf( "%c %d\n", Array_of_CharPointer[2], Array_of_CharPointer[3] ); 19printf( "%c %d\n", Array_of_CharPointer[4], Array_of_CharPointer[5] );

本当にこんなこと(あるいは,これと同程度に馬鹿馬鹿しいこと)をしろと指定されているのか?
という点を確認すべきに思う.
わざわざ「今日はクソみたいなコードを書きましょう!」とかいう課題が出されるとも思えないので.


アドバイスいただきたいです

とのことなので,真摯なアドバイスを書いたつもり.

投稿2021/10/12 01:43

編集2021/10/12 01:47
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/12 01:51 編集

たぶん「C言語で、char*[ ] に char とint の値を...」は、char* のポインタ配列ではなく、 > char *pointer_list=malloc(sizeof(char)*size); > pointer_list[num]= で推測するに、例えば char s[256]と言うcharの配列を char *s と表現したかったものの、説明が拙く終わってしまったということなのだと思います。(それが伝わらない質問内容だとも言えるのでしょうけれども <あるいは依然として私が読み誤っている可能性もありますが)
Zuishin

2021/10/12 02:04

ランレングス圧縮ですね。 > このコードは、インプットの例が "aabbc"のとき > a2b2c1とアウトプットするためのものです。(各単語の数を数える) argv[1] が "aabbc" の時、単純に malloc(strlen(argv[1]) + 1) して "a2b2c1" を入れるという課題じゃないかなと思います。 その際、オーバーフローすることがわかったなら元の文字列を出力するということなので、実際には "aabbc" が出力されます。 > また、インプットよりアウトプットの文字数が長くなった場合は、インプットされた文字列を出力するという制限があります。
fana

2021/10/12 02:08

> dodox86氏 私は pointer_list なる変数名から, 本来想定しているのは「pointer の list」(ここで "list" なる語が「配列」に対応)であるように推測しましたが,まぁ,はっきりしないですね.
dodox86

2021/10/12 02:16

@fanaさん > 私は pointer_list なる変数名から, > 本来想定しているのは「pointer の list」(ここで "list" なる語が「配列」に対応)であるように推測 確かにそうも受け取れますね。私のコメントはご回答を否定したものではなく「色々と違う解釈ができそうですね」程度のコメントでした。「質問への追記・修正、ベストアンサー選択の依頼」で指摘すべきコメントだったかもしれません。そうであれば大変失礼いたしました。
fana

2021/10/12 02:31 編集

> 否定 むしろ否定してください^^ (「お前の話はAともBともとれるぞ,どうなん?」という話が,はっきりさせるべき事柄がどこか?という思考整理のきっかけになる可能性もあるんじゃないかな,と. 現状,「何がわからないかもわからない」みたいな状態にも見えますので.) 最終的に,【質問者自身から否定される】ことになれば良いかな,と思っています. (課題内容未把握状態で変なコード書く前に,まずは,このような話ではない,と否定できる状態になるべき.)
Zuishin

2021/10/12 02:31

本当にそんな複雑な課題なのかなあ。 pointer_list はポインタのリストを作らなきゃと勝手に思った質問者さんが勝手に作ったものなんじゃないかと思うんですが。 > クラスメイトは、char*だけを使った。と言っていて混乱しています。
fana

2021/10/12 02:47

「文字 と 数値 があるんだけど,どうすれば?」とかいうあたりで引っかかっているのだとすれば, 数値は数値として文字とは別枠として持つ形にすればわかりやすいんじゃないかなぁ. (「絶対にchar*だけにしろ」とか何とかいう制約が課せられているのでないならば.最終的には出力さえ合ってれば良いんでしょうし)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問