■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
文字連結#C言語
1 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/21(土) 16:01
int 型の宣言で取得した数字を。
char 型に変えて、続けて格納していきたいんですがどうすればよいんでしょう?
int a;
char f;
1回目 a=2
fの中身は2
2回目 a=4
fの中身は24
3回目 a=7
fの中身は247
4回目 a=3
fの中身は2473
・・・
とこのようにしたいんです。

strcat関数などを使おうとしましたが。int型は怒られます。
それで、int型をいったんchar型の宣言bに b=aと使用とすると
やはりエラーが生じます。
int型のchar変換を、初歩的な質問かもしれませんが教えてください。



2 名前: Visual 名無しさん 投稿日: 2000/10/21(土) 16:21
charは文字列型じゃな〜ぁい……

int a;
char f[100]={0};

//1回目
a=2;
sprintf( f,"%s%d",f,a );
//2回目
a=4;
sprintf( f,"%s%d",f,a );
//3回目
a=7;
sprintf( f,"%s%d",f,a );
//4回目
a=3;
sprintf( f,"%s%d",f,a );


3 名前: 2 投稿日: 2000/10/21(土) 16:23
あ、やっぱ↑それダメだ。取り消し。


4 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/21(土) 17:43
うう、3流プログラマは以下のようになった・・
ガード等はしてないよ

int a,j,offs ;
char f[100] = { 0 } ; // 100は適当

offs = 0 ;
for(j=0; ??? ; j++) {
scanf("%d",&a) ;
sprintf(&f[offs],"%d",a) ;
offs = strlen(f) ;
}

>>1
たぶん、単に配列概念がわかってないだけでわ?



5 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/21(土) 18:18
>4
ありがとうございます!!。
目からウロコです。
sprintfという便利なものがあったんですね。
感謝、

#include<stdio.h>

main(){
int a,j,offs;
char f[100]={0};

offs=0;
for(j=0; j<=10; j++){
scanf("%d",&a);
sprintf(&f[offs],"%d",a);
offs=strlen(f);
}
printf("%s",f);
}



6 名前: 4 投稿日: 2000/10/21(土) 18:20
よけいなお世話かもしれないけど、
勉強の為なら、sprintf()の部分くらい自分で作ってみると
さらに理解度が深まるような気がする。



7 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/21(土) 20:14
ハァ? >4,5
なんか最初の質問の内容と趣旨が全然違うんだが‥?
いったい何が死体わけ?


8 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/21(土) 20:22
>7
よくわかってない人が質問するとこうなります。


9 名前: 4 投稿日: 2000/10/21(土) 21:02
>7
 で、こっちである程度予測して回答しても別にいいじゃん。



10 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/21(土) 22:58
>>7
「なにがしたいわけ?」って。
1の趣旨は、数値を文字列に変換して連結したいってことでしょ?



11 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/21(土) 23:26
なるへそ、投機実行ってわけね。
高度な技術やなぁ‥なっとく‥



12 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/21(土) 23:33
>>11
こういうスレで、「質問ができてない」って所からはじめると、
質問した人間はたいてい逃げます。


13 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/21(土) 23:46
さすが隔離板だね。>>1-6


14 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 02:12
>>13
先生、模範回答お願いします。


15 名前: 13 投稿日: 2000/10/22(日) 04:29
入力されるのが、0以上9以下と約束されているのなら、

#include<stdio.h>
#define MAX 100

void main(void)
{
int a=0,i;

char f[MAX], *p;

p = f;
i = 0;
while( i++ < MAX ){
printf("a = ? (999 で終了) : ");
scanf("%d",&a);

if( a == 999 ) break;

*p++ = '0'+a;
}
*p = '\0';
printf("Result : %s",f);
}



16 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 04:35
>>15 (ニセ13)
隔離板に相応しい、御迷答ですな。


17 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 05:09
>>16
先生、模範回答お願いします。


18 名前: 16(ニセ13) 投稿日: 2000/10/22(日) 05:49
int型の範囲(-32768〜32767)をカバーできるようにしてみました。

#include<stdio.h>
#include<string.h>

void main(void)
{
int a, i, j, count=1, flag=0;

char f[256], temp[10], w;

while( 1 ){
printf("%d回目 a = ",count++);
scanf("%d",&a);

if( a < 0 ){
flag = -1;
a = -a;
}

i = 0;
do{
temp[i++] = a%10 + '0' ;
a /= 10;
}while( a > 0 );
if( flag == -1 )
temp[i++] = '-' ;
temp[i] = '\0' ;
i--;
j = 0;

while( i>j ){
w = temp[i];
temp[i] = temp[j];
temp[j] = w;
i--;
j++;
}
strcat( f, temp );
printf("fの中身は : %s\n",f);
flag = 0;
}
}

>>16
先ほどのソースに不備がありましたでしょうか?


19 名前: ニセ13 投稿日: 2000/10/22(日) 05:58
-32768は無理か・・・

ブレイク方法は使用者まかせだけど、1さんがやりたかったのは
こういうのじゃないのかなぁ。



20 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 06:07
sprintf(f, "%d", a);



21 名前: 4 投稿日: 2000/10/22(日) 13:55
>>18 >>19
なるほど。まぁそうなんでしょう。
これを実行すると、1さんの書いたとーりにゃなりますな。

ところで、わざわざsprintfを解体したんだから、
strcatも解体すればかっちょええのでわ?
#つーか、最後にtempバッファで入れ替えする必要ないよぉな・・・

 話しは変わりますが、
 intって16ビットなんですか?
 今時、ILP32 で考えるのが普通かと思ってました。
 それはやめとけ?ですかね?



22 名前: 13 投稿日: 2000/10/22(日) 14:24
まだ、解決してないのかあまりにあほ臭いので、つくってやったぞ。
即席で作ったから、正しいという保証はできないが。

char *strcat_i2a(char *des, int x)
{
  char work[24], *p; /* \log_10 2^{64} = 19.2... */
  int negative;

  negative = x < 0 ? x= -x : 0;
  for(p = work+sizeof(work), *--p = '\0'; x!=0;x/=10) *--p = '0'+x%10;
  if(negative) *--p = '-';
  return strcat(des, p);
}


23 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 14:59
マジでよくわからんのだが、こぞって車輪の再発明を行なっている理由は何?



24 名前: ニセ13>4 投稿日: 2000/10/22(日) 15:38
>strcatも解体すればかっちょええのでわ?

単純だからまぁいいか、と思ったんですが。
char *strcat( char *s1, char *s2 )
{
char *p = s1;
while( *p ) p++;
while( *p++ = *s2++ );
return s1;
}

>#つーか、最後にtempバッファで入れ替えする必要ないよぉな・・・

iとj使って、配列tempの前後を入れ替えてる作業のことですよね?
aに「-123」と入力すると、tempには「321-」と格納してますから、
最後に入れ替えたんですが。

>intって16ビットなんですか?

2バイトのシステムもありますし、4バイトのシステムもありますね。
これ以外のサイズのintは見たことないんですが、あるのかな?



25 名前: ニセ13 投稿日: 2000/10/22(日) 15:59
>4

失礼。「intが2バイトっていうのは古い」という意味でおっしゃってたんですね。
”ILP32”って単語の意味がわからなかったんで、
検索してみたらintは4バイトってなってますね。
自分のパソコンでのことしか事しか考えていませんでした。
もっと視野を広げないとダメですね。

>23

上級者さんには退屈だとおもうんですが、
私のような初心者には調度いい問題ですよ(^^




26 名前: 4 投稿日: 2000/10/22(日) 16:40
>>24 >>25
 あ、言葉足らずでごめんなさい。
 tempバッファでひっくり返さなくても
 直接fに書きこめばいいかな。と思ったのです。

 ちなみにNECのACOS6とかだと、int36ビットというのもありました。
 8進数はつらかった。

>>23
 暇つぶしにゃ、いいかと思うんですが。
 べつに再度やってはならない理由はないかと。
 


27 名前: 23 投稿日: 2000/10/22(日) 17:11
いや、自分で遊ぶ分には結構だが、1のような初心者に教えるようなケースでは
適切とは言えないと思うのだよ。車輪の再発明は、決して褒められたこと
ではないからな。
ただでさえ初心者は車輪の再発明をしがちなのだから、適切なライブラリ関数
の存在と使用方法を教えるのが正しいやり方じゃないか?



28 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 17:17
学生だったら、最初の頃はライブラリ関数の仕様理解を兼ねて、
車輪の再発明もわるくはないかと。
大学の学生実験なんか、みんな車輪の再発明じゃん。
手を動かすと、理解が進むからね。

仕事でこれをやられたらたまらんけどね。
でも、頭悪すぎ。>ニセ13 & 1


29 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 17:30
とほほ。学生実験は追試の一種だろうよ。
いわんとすることはわかるが、車輪の再発明ってのは
ライブラリ関数の存在を知らずに八角形の車輪を作ったりする
ことだろ。


30 名前: 4 投稿日: 2000/10/22(日) 17:44
>>29
車輪の再発明 = 八角形の車輪を作ったりする
ってわけではないでしょう?
大抵そうなる。っつーだけで。
八角形だろうか、三角形になろうが、重要なのは
それを丸くする努力であって、
最初から工場のラインに頼むのはどうかな。と思うけど。


また、firmな世界から言うと、標準ライブラリに溺れた学生は
使えないです。
確かに、的確なライブラリの存在や習得も重要ですけどね。

#まー私的には、なんでもいいけど、2chなんて暇つぶしなんだから
#どーだっていいじゃん。と思うが。



31 名前: 29 投稿日: 2000/10/22(日) 18:01
「車輪の再発明 = 八角形の車輪を作る」じゃなくて
「車輪の再発明 = 八角形の車輪を作ったりする」ってこと。
出来合いのそこそこ丸い汎用的な車輪があるのに、
それを知らずに再発明するのはヴァカのすることだ。

たまに張り切ったヴァカが24角形くらいに削り磨くことは
あるが、それはどうしようもなく無駄な努力。

追試と再発明は別物なんだけど、そこんとこわかってる?
で、追試も再発明さえもしたことない学生がスカだっただけでしょ。


32 名前: 4 投稿日: 2000/10/22(日) 18:42
プログラムするのに、無駄な努力っていらないんだー。
俺、初めて知った。
というか、プログラムって無駄な努力の上に成り立っているもの。
という認識でいままでいたが。

そこまで頑なに排除しなくてもいいよーに思うな。



33 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 19:16
「車輪の再発明」を繰り返してる奴、よほどの天才だな。
そうでなければ、ばかじゃねーの?
strncpyを自分で「使う」ために作ってる訳ね―じゃん。
勉強と理解のためにやってるんだろうに。

それを否定する人間は、「画面にHello World.と表示するプログラム」や
「ウィンドウを表示するだけのプログラム」なんて作った事無いんだろうな。
すげえすげえ。


34 名前: 33 投稿日: 2000/10/22(日) 19:28
こいつは教科書の英語を訳すときも
「既に訳されているので私が行う必要はありません」
数学の証明問題も
「既に証明されているので私が行う必要はありません」
と答えていたんだろうな。
よく高校を卒業できたもんだ。


35 名前: 23 投稿日: 2000/10/22(日) 19:43
>>33
↓のことなら、俺じゃないぞ。
まあ、どうでもいいことだがな。
http://piza.2ch.net/test/read.cgi?bbs=tech&key=972032579&st=93&to=93&nofirst=true




36 名前: 33 投稿日: 2000/10/22(日) 20:08
スマン。俺も熱くなりすぎた。
が、このスレに書いてる奴も「(1を課題とみなして)自分ならこう考える」と
いう考えた結果を書きこんでるんだと思うぞ。
だとすれば、周りで見ている奴(含俺)には無意味でも、
当人にとっては充分に意味があるはず。


37 名前: 23 投稿日: 2000/10/22(日) 20:21
まあ、俺の考えは大体27に述べた通りなんだが、29や「お姉さん」スレッド
に書き込んだ奴ほどは「過激派」ではないつもりだ。
ていうか、「お姉さん」スレッドの奴は、文体から言って明らかに厨房なんだから
あまり気にするな。

まあ、正直確かに口を挟む程のことでは無かったという気はするよ。多分
> 当人にとっては充分に意味がある
遊びが、当初の1の質問をちょっとないがしろにした形で進んでいるような
気がしてちょいと気になっただけだ。
sprintfを初めて知った初心者に教えることか?とね。



38 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 21:16
>37
スレなんか立てないで入門書で自習するのがよろし。>初心者




39 名前: ななし 投稿日: 2000/10/22(日) 21:36
>23,33
両名ともいったい何をなれあってるの?もっと熱くなれ〜。

>23 (>>37)
"sprintfを初めて知った初心者に教えることか?とね。 "
質問のしかたも悪ければ、本人の努力も足りないわけだし、
わざわざ親切に1の望む答えを出してやる必要もないと思うけどね。

>33 (>>36)
"周りで見ている奴(含俺)には無意味でも当人にとっては充分に意味があるはず。"
家でオナニーするのは十分本人には意味があるが、
他人がみても気持ちのいいものだとは思えないがどうだい?

車輪の再発明するのは、学習過程においては有意義だと思うが、
ダメコードをだらだらと掲示板に流すのは止めて欲しいな。
醜い上に、情報量が少ない。コピペ荒らしと大した違いないと思うが。いかがかな?




40 名前: 23 投稿日: 2000/10/22(日) 22:34
>>39
すまんな、飽きっぽいんだよ。
それと、あんたの書き込みも俺のこの書き込みも、技術的な話題を
求めてくる人間にとっては十分に
> 醜い上に、情報量が少ない。コピペ荒らしと大した違いないと思うが。い
> かがかな?
ってことになるぜ。
あまり無理するな。



41 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/22(日) 23:29
>>40
技術系の掲示板やMLでも運営関連の話題は普通に行われてるよ。


42 名前: 39 投稿日: 2000/10/22(日) 23:34
答えも出てるようだし、このスレはもう用済みだろ。

>>23 で君が発言するまでは放置してたのにね。
ほっときゃいいのにねえ。君ってからかうと本当に面白そうだよ。
頭も腕もそんなに悪くはなさそうだけどね。
あんまり無理するなオマエモナ>23

俺って本当に性格悪いと思うよ。


43 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/10/23(月) 12:26
二人とも嫌なことがあったとしか思えないな >>39 >>23