C言語なら俺に聞け(入門篇) Part 21

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/11/30(金) 06:33:17
>>950
良く分からんかったからバブルソートにしたw
#include <stdio.h>
#define N 10
main(){
int a[N];
int n=0;
int i,j,x,b;

printf("データを入力 データ数の上限は10、下限は1\n");
printf("終了時は CTRL+d を押下\n");
while(n<N && scanf("%d",&a[n])!=EOF) ++n;
for(j=n;j>=1;j--){
for(i=0;i<j-1;i++){
if(a[i]<a[i+1]){
x=a[i+1];
a[i+1]=a[i];
a[i]=x;
}
}
}
for( b=0; b<n; b++ ) printf("value[%d] = %d\n", b, a[b]);
}
一応動くけど、書き方悪いと思うから推敲してね
953デフォルトの名無しさん:2007/11/30(金) 07:37:07
>>950

どう入力をしたらどう出力された?
それが無いとわからん。

ただ、scanf()はあまり使わんほうがいいよ。
簡単にバッファオーバーフローするから。
954デフォルトの名無しさん:2007/11/30(金) 08:58:48
>簡単にバッファオーバーフローするから。
ほほ〜
実例希望。
955デフォルトの名無しさん:2007/11/30(金) 09:05:45
どうせ学校の宿題なんだろうし、特に指定が無い限りscanf使った方が楽でいい
956デフォルトの名無しさん:2007/11/30(金) 10:34:09
>>925
DOSの方はプログラムに何かバグがあるんだろう。
Windowsの方は、仮想記憶があるので物理RAMがいくらだろうと1プロセス
で2GBぐらいまでmalloc()できる。でも、もちろんたくさんメモリ確保す
ると著しくパフォーマンスが落ちる。
957デフォルトの名無しさん:2007/11/30(金) 11:43:22
プログラムを実行したときの関数呼び出しを全てログに取る方法ってないでしょうか?
要するにすべての関数の中に
printf("関数名\n");
を入れればいいのですが、それを簡単にやる方法はないでしょうか。
コンパイラはgccなのでgdbを使ってもいいんですが。
よろしくお願いします。
958デフォルトの名無しさん:2007/11/30(金) 12:31:09
>>957
プロファイラー

cc -pg
959デフォルトの名無しさん:2007/11/30(金) 13:00:25
>>957
cc -c foo.c -p
cc foo.o -p
./a.out
gprof
960デフォルトの名無しさん:2007/11/30(金) 15:12:46
system("    ")の中身を標準入力から指定できますか?
例えば./a.out data.txtとしてdata.txtを表示させたいときには
system("cat ???");どうすればいいですか?
961デフォルトの名無しさん:2007/11/30(金) 15:14:31
>>960
sprintf()でも使って繋げばよろしかろ。
962957:2007/11/30(金) 16:03:31
>>958 >>959
この辺でできそうなことがわかりました。ありがとうございます。

DSAS開発者の部屋:オープンソースを楽しむエンジニアの二日目 - ftraceコマンドを書く
http://dsas.blog.klab.org/archives/51025093.html
Index of /~krahmer/instrumental
http://www.suse.de/~krahmer/instrumental/
963デフォルトの名無しさん:2007/11/30(金) 17:07:21
文字列を逆にして返す関数を作りたいのですが
どうやったら逆にコピーできるんですか?
誰か教えてください

964デフォルトの名無しさん:2007/11/30(金) 17:21:50
>>963
1文字ずつコピーするんだよ
965デフォルトの名無しさん:2007/11/30(金) 17:22:06
同じchar配列を書き換えていいのなら、
void rev(char *buf) {
int i, len = strlen(buf);
char c;
for (i = 0; i < len / 2; i++) {
c = buf[i];
buf[i] = buf[len - 1 - i];
buf[len - 1 - i] = c;
}
}
int main() {
char buf[64];
strcpy(buf, "abcdef");
printf("%s\n", buf);
rev(buf);
printf("%s\n", buf);
return 0;
}
966デフォルトの名無しさん:2007/11/30(金) 17:39:37
日本語判定が無髄
967デフォルトの名無しさん:2007/11/30(金) 17:56:33
そうか。Cでするときはどうするんだろうね。
チマチマ頑張るのか、それ用の何かがあるのか。
968デフォルトの名無しさん:2007/11/30(金) 17:57:28
>>965
なるほど〜ありがとうございます。
ただちょっと自分頭が弱いみたいで
for (i = 0; i < len / 2; i++)
この部分が完全に理解できてないです。
確かに実行するとちゃんと逆にコピーしてくれますが何故 len/2なのでしょうか?
ずっとlenだと思ってて、だけど半分しか逆にならないっていう感じでした…
969デフォルトの名無しさん:2007/11/30(金) 18:00:15
入れ替えてるから半分でいいんだろ
最後までって、単にコピーしてたんじゃ
後半は前半コピーしたやつを書き戻すだけだから半分にみえるだろうな
970デフォルトの名無しさん:2007/11/30(金) 18:05:06
>>968
最終的には、前の半分を後ろの半分と置き換えてるんです。
前から0番目と、後から0番目を交換、
前から1番目と、後から1番目を交換、
 :
 :
前からlen/2番目と、後からlen/2番目を交換、
ここまでで達成しており、len番目まで交換すると、
どうなるでしょうか。元に戻ってしまうことがわかります。
971デフォルトの名無しさん:2007/11/30(金) 18:07:02
訂正:
前からlen/2 - 1番目と、後からlen/2 - 1番目を交換、
ここまでで達成しており、len - 1番目まで交換すると、
972デフォルトの名無しさん:2007/11/30(金) 18:07:30
課題なら馬鹿ソートでいいじゃん
973デフォルトの名無しさん:2007/11/30(金) 18:27:34
ボゴソートがなんだって?
974デフォルトの名無しさん:2007/11/30(金) 18:29:28
>>969-970
詳しく解説ありがとう
「交換してた」ってことだったんですね!
確かに交換してるなら半分で交換を止めないと残り半分は元通りに戻っちゃいますね
どうりでおかしかったわけだ 親切にどうもです

前から0番目に後から0番目をコピー
前から1番目に後から1番目をコピー、
 :
 :
こう考えてしまってました・・・

975デフォルトの名無しさん:2007/11/30(金) 18:36:04
char* pStr = "123456";

これを2バイトずつ分割して、char型の1バイト10進数値(12,34,56)
に変換したいのですが、

先頭から2バイト取出し(適当な配列へ格納)
 ↓
atoi関数でint型整数へ変換
 ↓
これを、char型へキャストして、最終的に格納したいchar型配列へ
 ↓
次の2バイト文字へポインタ移動
 ↓
ここまでのフローをあと2回繰り返し

自分としては、こういった処理を考えています。
これでも出来るとは思うのですが、ほかにスマートな方法等あれば
教えてください。

976デフォルトの名無しさん:2007/11/30(金) 18:53:38
スマートじゃねーけど、
sscanf(pStr, "%2d%2d%2d", &a,&b,&c);
とか
977デフォルトの名無しさん:2007/11/30(金) 19:07:19
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main() {
char *pStr = "123456";
char tmp[3] = {};

int i=0;
do {
memcpy(tmp, (pStr+i), 2);
printf("%s\n", tmp);
i+=2;
}
while (*(pStr+i+1) != '\0');
}
978デフォルトの名無しさん:2007/11/30(金) 19:22:14
returnするの忘れてた
この方法ならpStrの文字数が偶数であるなら
何文字でも可能
forならもっとスマートになるかも
979デフォルトの名無しさん:2007/11/30(金) 19:37:06
>>796さんの案をパクッて、
int main() {
char *pStr = "123456";
char charvalue, *p, *tail = pStr + strlen(pStr);
int intvalue;
for (p = pStr; p < tail; p += 2) {
sscanf(p, "%2d", &intvalue);
charvalue = (char)intvalue;
printf("%d ", charvalue);
}
return 0;
}
980デフォルトの名無しさん:2007/11/30(金) 19:38:32
訂正:
>>976さんの案をパクッて…と言うより、ほとんど>>975の手順のままだけど、
981デフォルトの名無しさん:2007/11/30(金) 20:21:07
一旦、atoi関数でint型へ変換してからchar型へキャストするのが、
どうもすっきりしないでいました。
>>977さんのサンプルだと、memcpy関数を使えば、char*型のみでコピー
できますね。
文字列は、14バイト(NULL文字含むと15バイト)固定なので、2バイトずつ
ポインタ移動しながらmemcpyを繰り返していけると思います。
皆さん、ありがとうございました。

982デフォルトの名無しさん:2007/11/30(金) 20:23:53
マクロ名について質問させてください。

除算は「DIVISION」ですが
除算しないは何て記述するのが一番適切ですか?
983デフォルトの名無しさん:2007/11/30(金) 20:27:26
あっ除算しないじゃなくて、除算以外でした・・・
984デフォルトの名無しさん:2007/11/30(金) 20:28:43
>>977
それだったらmemcpyしなくても、printf("%.2s\n", pStr + i)で十分じゃないか?
985983:2007/11/30(金) 20:34:23
あっすいません
解決しました・・・
986977:2007/11/30(金) 21:05:33
>>984
表示するだけならね
でも、スマートにコピーする方法というのが今回の問題点
987890:2007/11/30(金) 21:26:22
890ですが他で聞いてみます。
904さん考えていただきありがとうございました
988デフォルトの名無しさん:2007/11/30(金) 21:51:26
>>938
事前に定義できるならunion(共用体)。
まあ配列程度なら普通に定数なりとかけ合わせて位置取る方が楽だろうけど
989デフォルトの名無しさん:2007/11/30(金) 22:37:38
char cBuf[2];
char c;

for( n=0; n<strlen(pStr); n+=2 )
{
 strncpy( cBuf, pStr+n, 2 );
 c = (char)atoi(cBuf);
 printf( "%d", c );
}

???
990デフォルトの名無しさん:2007/12/01(土) 00:37:40
BCC developerを使ってるんですが、線を描画するライブラリとかりますか?
ある座標からある座標に線を引きたいんです
991デフォルトの名無しさん:2007/12/01(土) 01:44:58
MoveToEx と LineTo
992デフォルトの名無しさん:2007/12/01(土) 02:33:33
共用体って何か意義あるの?
構造体で十分な気がするけど……?
993デフォルトの名無しさん:2007/12/01(土) 02:35:12
IPアドレス
994904:2007/12/01(土) 04:24:17
>>890,987
多分今度こそコレでいい……はず。

#include <stdio.h>
#define NumMax 100

void print_numbers(int *numList)
{
int i = 0,len;
while(numList[i++] != 0) ;
len = i-2;
for(i = 0;i < len;i++) printf("%d,",numList[i]);
printf("%d\n",numList[i]);

}
995904:2007/12/01(土) 04:24:51
>>994の続き

void foo(int *numList,int n,int limit,int targetIndex,int len,)
{
int tempList[NumMax] = {0};

if(limit >= n || targetIndex >= len) return;

memcpy(tempList,numList,sizeof(int)*n);

if(tempList[targetIndex] < limit && len >= 1){
if(targetIndex < 1 || tempList[targetIndex] < tempList[targetIndex-1]){
tempList[targetIndex]++; tempList[len--] = 0;
print_numbers(tempList);
foo(tempList,n,2,targetIndex+1,len);
}
}
foo(tempList,n,limit+1,targetIndex,len);
}
996904:2007/12/01(土) 04:25:43
>>995の続き

int main(void)
{
int i,n,numList[NumMax+1] = {0};

printf("INPUT:");
scanf("%d",&n);
if(n > NumMax) n = NumMax;

for(i = 0;i < n;i++) numList[i] = 1;
numList[i] = 0; /* 12:1,1,1,1,1,1,1,1,1,1,1,1 */
foo(numList,n,1,0,n-1);

return 0;
}

駄目だったらゴメンナサイってことで。
997デフォルトの名無しさん:2007/12/01(土) 09:49:17
>>992
そもそも共用体と構造体は使用目的が違うので比較すること自体が無意味
だから、「構造体で十分・・・」はない

怪人二十面相のようなデータ
あるときはint、あるときはfloat、はたまたあることは構造体A、そしてあるときは構造体B
こんなデータを参照するときに使う

そんなデータがあるかって!?
998デフォルトの名無しさん:2007/12/01(土) 09:52:21
なにそのvariant型
999デフォルトの名無しさん:2007/12/01(土) 11:23:44
999
1000デフォルトの名無しさん:2007/12/01(土) 11:24:51
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。