C言語なら俺に聞け! Part 70

このエントリーをはてなブックマークに追加
>>711
VC++ ならデバッグ実行中にブレークポイントで止めて、
ステップインすればいい。
多分アセンブリ言語だと思うけどね...。

GCC なら GCC のソースコードを読めばいけると思う。
713デフォルトの名無しさん:04/01/05 08:48
基本情報の資格をとるにはC言語をどのぐらいのレベルまで
マスターすればいいのですか
>>707
そのプロセスでの論理アドレス
>>713
マスターなんかする必要ない。用語を覚えてひたすら問題集をやる。
資格とはそういうものだ。
>>713
それの何処が C に関する話題なんだよ…
なにこいつ
どいつ?
どどいつ?
720デフォルトの名無しさん:04/01/05 13:37
すいませんつぎの演習問題がわからないので教えてください。

以下のプログラムを作成、テストして下さい。
・入力された受験者の氏名と性別テストの得点を読み込み構造体に格納する。
・男女別の平均点をだし、その平均点を基準とした合格、不合格のデータを各人の構造体に格納する。
・男女別に合格者の氏名と合格点をコンソールにひょうじする。

出力イメージ

%goukaku
please input name & sei(f or m) & score
tomoko f 80
yuko f 65
takuya m 55
kohoru f 70
satoshi m 60
masaki m 95
mina m 50
CTL+D
***goukaku ( male )***
masaki 95
***goukaku ( femail )***
tomoko 80
kahoru 70
%
出力イメージとまったく同じにしなくてもよい

以上夜しくお願いします。
>>720
こちらへどうぞ

ぼるじょあがC/C++の宿題を片づけますYO! 18代目
http://pc2.2ch.net/test/read.cgi/tech/1071407728/
頼むからローカルルールと1くらい読んできてくれ。
標準ライブラリ関数のみを使って、
ディレクトリが書き込み可能であるか調べる方法はありますか?

ディレクトリ名に任意のファイル名を繋げて、
hoge = fopen( 何たら, "w" );
でhogeを調べればほぼOKなんですけど、
もし、自分よりエライ権限を持った人が、
パーミッション000等でファイルを置いていれば、
上記の方法では、間違った結果を返すことになってしまいます。
それだと、ディレクトリが書き込み禁止で、
書き込み可のファイルがあるだけでも破綻する。

ディレクトリの概念は本来OS依存なので、
その属性チェックもOSごとに必要だろう。
724の言う通りだな
726デフォルトの名無しさん:04/01/05 18:03
void* v = malloc(100);
v = realloc(v, 50);
とした場合、vのブロックの残り50バイトのメモリ領域は開放された状態になっているのでしょうか?
残り?
元の領域と重なっているかどうかは不定だぞい
>>726
内部でどういう扱いになってるかは分からんが、
free しなくてもいい状態になっていることだけは確かだ。
729デフォルトの名無しさん:04/01/05 18:07
げ、そうなんですか?
てっきり同じかと・・・・・。
730not727:04/01/05 18:20
>>727の質問と
>>728の回答を待っていました。
K&Rのreallocの説明を見ると
古いサイズおよび新しいサイズの新しいところまでは不変である
と書いてあるが、他の書籍では>>727の言うように書いてあったりする。

どちらが正しいのでしょうか?それとも未定義ナのでしょうか?

あと、仮に「領域は重なる」と定義されていない場合、
reallocの存在意義はなんなのでしょうか?
free -> mallocと同じでは?
731デフォルトの名無しさん:04/01/05 18:21
>>730
「領域が重なる」と「中身が同じ」はイコールじゃない。
重ならなくても50バイトまでコピーすれば中身は同じ
"新旧のサイズのうち、小さいほうのブロックに含まれる内容は変更されない。"だけです。
領域が同じとは限らない
733730:04/01/05 18:26
あぁ間違えた…

>>730において、
一行目は「>>726の質問と」
二行目は「>>727の回答を待っていました。」
の書き間違いです。

どーでもいいですが、
名前も「not726」の書き間違いです。
734726:04/01/05 18:32
とすると、
malloc で確保したメモリを realloc した場合は、malloc で確保したメモリ領域のサイズに
かかわらず、reallocした方のメモリを解放する事だけ意識すればよい。と、いう事ですね。

735730:04/01/05 18:33
理解しました。ありがとう御座いました。

(  つД`) >730は四行目も何か変だったし、あぁ頭悪い…)
736デフォルトの名無しさん:04/01/05 20:31

int x;
printf("input number X=>");
scanf("%d",&x);

int *a=(int *)calloc(x, sizeof(int));

とコーディングしたのですがエラーが出てしまいます。
原因がわかりません。。・゚・(ノД`)
どこをどうすれば良いでしょうか?
int *a=calloc(x * sizeof(int));
>>737
void *calloc(size_t n, size_t size);
だが。
int x;printf("input number X=>");scanf("%d",&x);
{
int *a=(int *)calloc(x, sizeof(int));
}

にしなはれ。
737,738,739さんどうもありがとうございました。

試してみたところ動いたのでとてもびっくりしています?
この{}は何故必要なのでしょうか?
作成したメモリ領域の解放のためのfree(a);も{}の中に入れなければエラーが出てしまうのですが、何か関係があるのでしょうか?
>>739
単純に int *a;をブロックの先頭で宣言すればいいだけの話では。
>741
本当だ!

int *a;
int x;
printf("input number X=>");
scanf("%d",&x);

a = (int *)calloc(x, sizeof(int));

free(a);

でコンパイルできました!
あぁ〜!そうか先頭で!!
こんな基本的なことも忘れてたなんて。
どうも本当にご迷惑をかけました。m(_ _;)m
726とそれに答えてる連中は学生なのか…
reallocは確保し直すのであって、
つまりmallocした領域を再確保したならばそれは、mallocの領域は開放不可(上書きされてる)
つまりメモリリークだ。
上手く動いてるのは偶然だ。
>>743
学生を差別するの(・A・)イクナイ!!
おまいらいちばん肝心なことをサボんな
規格票よめ、規格票!!
>>743
何が言いたいのかよくわからん。
>つまりメモリリークだ。
( ´∀`)お前ガナー
一応マヂレスしておくと realloc() は
新たに確保 & コピー & 元の解放 だ

但し ptr=realloc(ptr, サイズ) ってな感じで使っていると
"新たに確保"に失敗した場合 ptr==NULL になっているので
そういった意味では前に確保した領域の解放ができないが
>>743 が言っている事は意味不明
上手く動いてるのは偶然な >>743 がいるスレはここでつか(w
750デフォルトの名無しさん:04/01/06 10:11
初心者です。%e これはなんと読むんでしょうか?
eは何の頭文字で、どのような意味なのか教えてくださいませ。
普通に読めばいい。
eは、恐らくexponentの略だと思われ。意味は辞書でも引いてください。
exponent
意味くらい自分で調べてくれ
さまよう目
万国博覧会だっけ
そうか、floating eye と floating point をかけているのか!
756726:04/01/06 15:27
ファイルサイズを取得する関数はありますか?
757726:04/01/06 15:29
>>748
ありがとうございました。
理解できました。
qsort()の使い方を勉強してるのですが、うまく動き
ません、まちがっているところを指摘していただきたいのですが。
#include<stdio.h>
#include<stdlib.h>

int cmp(const void *a,const void *b){
if((int*)a > (int*)b)return -1;
else if((int*)a <= (int*)b)return 1;
return 0;
}

int main(void){
int i;
int s[]={3,5,3,6,4,5,2,8,55,};
qsort(s,9,sizeof(s[0]),cmp);

for(i=0;i < 9;i++)
printf("s[%d]=%d \n",i,s[i]);

return 0;
}
>>758
ポインタを比較してどうするよ。ついでに、降順だけどいいのか?
if(int(*a) > int(*b))return 1;

if(a > b)return 1;
で試してみたけれどできませんでした。
こうしてみたけどだめでした。・。゚(゚´Д`゚)゜。
正しい書き方を教えてもらえませんか?
*(int *)a
>>761
あっなるほど。。。
(int*)はあくまで(void*)のものを
キャストしているだけで・・・
その後に実体を操作しなければいけないってことですね。

>>756
>1のC FAQ 日本語訳にある。
くだらない質問で悪いんだけどさ、
int i;
i = atoi((char *)getchar());
みたいなことできないの?
セグメントエラーでんだけど
できない。
>>765
できないって言ってもはじまらない。
あきらめないでできる方法を探すんだw
一文字なら'0'を引けばいいじゃん。
'0'から'9'までは必ず連続しているし。
>>794
getchar()はintを返す。
i = getchar() - '0';としとけ。
atoi((char []){(char)getchar(), '\0'});
だれかテストしてくれ。
770デフォルトの名無しさん:04/01/06 18:16
コンパウンドリテラルキターーーーーーーーーーーーーーーーーー!!!!!!
>>769
テストするまでもない
772デフォルトの名無しさん:04/01/06 18:19
レスたくさんさんくす。
>>767と8のでよかったよ。
getchar()が文字コード返すからatoi使おうと思ったけど、'0'ひきゃあいいのね。
漏れ頭悪かった。
773デフォルトの名無しさん:04/01/06 18:23
>>769
gcc3.3.2で通った。
(char)へのキャストは不要っぽい。
もちろん-std=c99 -pedanticはつけて
>>773
サンクス。
でもEOF返ったらいやだよな。
EOF というか、数字以外のがきても嫌だぜ。
>>776
嫌って?
printf("%s","??-");

こう書くとチルダ1文字が表示されてしまいます。

??-って表示したいんですけど。
trigraphかよ。
あのー、

int i,a[7] = { 0045,0071,1001,2003,4005,6001,0564 };
for(i=0;i<7;i++) printf("%d\n",a[i]);

なんだか数字が違うんですけど。
へー、英語ではそう言うのか。
8進
783764:04/01/06 19:45
似たような質問なんだけど、
i = getchar() - '0';
printf("ok%d\n",i);
i = getchar() - '0';
printf("ok%d\n",i);
i = getchar() - '0';
printf("ok%d\n",i);

ってコードで、
3
ok3
4
ok4
5
ok5
という出力を期待してるんだけど、
3を入力した後リターンキー押さないと
ok3
て出てくれない。つまり次に進んでくれない。
しかもバッファにリターンが残ってるから、
次が
ok-38
てなことになっちまう。
なにかいい方法ないですか?
kbhitも使え
785778:04/01/06 19:50
解決しますた。

>>779
ヒントありがd
786783:04/01/06 20:16
getch で解決。
#include<stdio.h>
#include<stdlib.h>
struct list{
int num;
struct list *next;
}LIST;
main(){
struct LIST *base, *pi;
FILE *fp;
fp=fopen("a.txt","r"); /*a.txtには1〜5の数字があるとする */
base=(struct LIST*)malloc(sizeof(struct LIST));
base->next=NULL;
while((fscanf(fp,"%d",&base->num)) != EOF){
p=(struct LIST*)malloc(sizeof(struct LIST));
base->next = p;
base=p;
}
while(base->next != NULL){
printf("逆順表示%d\n",base->next);
base=base->next;
}
}









>>783
getchar の戻り値チェックして、改行を飛ばせ。
>>787
struct LIST {
int num;
struct LIST *next;
};
>>787
printf("逆順表示%d\n",base->next);
・・・・・
間違いまくり。
void*の使い方についてお聞きしたいのですが。
bsearchやqsortなどの関数で探したい値の型は何でも探せる
ようになってますが、その際にサイズとしてsize_t型を引数として
与えていますよね。
で、探したい値や探す配列はvoid*型の引数として
受け取っているので、size_tで受け取った型にキャストしないと使えない
と思うんですよ。
その時size_t型でバイト数はわかるけれども実際にint型なのかlong型
なのかって判らないと思うのですが、どんなふうにしてキャストしてるんでしょうか?
知っている方が居ればご指導下さい。よろしくお願いします。
>>791
bsearchやqsortで、「探したい値や探す配列」の値について意識するのは、
bsearchやqsortを使用するプログラム側であって、
bsearchやqsortは単にメモリブロックとして扱ってるだけ。

だから、比較関数を自前でかく必要があるし、自前で書くなら、
int型だろうがlong型だろうが構造体型だろうが、解ってるだろ、ってこった。
memcpyはvoid*, const void*, size_tだよな。
それと同じで、移動するだけなら、その型が実際は
何であるのかは問題ではない。(unsigned char*)にでも
キャストしておけばよろしい。
 実際にその型が何であるか問題になるのは、比較関数であり、
それはユーザが作るわけで型を渡す必要はない。
794こうだな:04/01/06 23:42
struct LIST{
int num;
struct LIST *prev;
struct LIST *next;
};
struct LIST *base, *p;
FILE *fp;
fp=fopen("a.txt","r"); /*a.txtには1〜5の数字があるとする */
base=(struct LIST*)malloc(sizeof(struct LIST));
base->prev=base->next=NULL;
while((fscanf(fp,"%d",&base->num)) != EOF){
printf("%d\n",base->num);
p=(struct LIST*)malloc(sizeof(struct LIST));
p->prev=base;
base->next = p;
base=p;
base->next=NULL;
}
while(base->prev != NULL){
base=base->prev;
printf("逆順表示%d\n",base->num);
}
>>791
>で、探したい値や探す配列はvoid*型の引数として
>受け取っているので、size_tで受け取った型にキャストしないと使えない

言ってる事が意味不明。
796デフォルトの名無しさん:04/01/07 14:06
cで空白のTrimをしたいときはどうしたらよいでしょうか?
>>796
  /* 先頭の空白を除去し、別領域にコピー */
  char *ltrim_withcopy(char *dst, const char *src) {
    while (*src && isspace(*src))
      src++;
    return strcpy(dst, src);
  }

  /* 後続の空白を除去し、別領域にコピー */
  char *rtrim_withcopy(char *dst, const char *src) {
    size_t t = strlen(src) - 1;
    while (t>=0 && isspace(src[t]))
      t--;
    strncpy(dst, src, t + 1)[t + 1] = '\0';
    return dst;
  }

  /* src と dst が指す領域が等しい、あるいは重なっているときは
   使用できない。 */
798デフォルトの名無しさん ◆93GCE9hnmM :04/01/07 17:21
 BCCで本格的にソフトを製作している強者会社はありませんか?
>>798
ここ
ttp://www.borland.co.jp/

実際、探せば幾らでも見つかると思うが。
質問。

getc(),fgetc(),getchar()で一文字読み込んで、
読み込んだストリームに対して、
ungetc()をするとき、失敗することはありえますか?

getcして、文字の確認をして、ungetcした後に、
ungetcが成功したか調べるのは、冗長なのかしりたかったのですが。
>>799
そこはでるふぃだYO!
CPU:Celeron2.40GHz メモリ:512MB HDD:120GB
OS:WindowsXP テレビチューナー
DVDマルチドライブ (DVD-RAM/R/RW)

以上のスペックのデスクトップパソコンを無料で2台譲ります。
欲しい方居ましたら貰ってやって下さい。

  副収入徹底攻略まにゅある  と検索してサイトへアクセスお願いします。
>>794
なるほど!助かりました。
レス有難う御座いました。
>803
ばーか。
C言語で32bit(4,294,967,295)を超える計算はできないのでしょうか?
例えば
if( y*y = x*x*x*x ){
   {処理}
}
てなことで、x^4の値が256を超える(=4,294,967,295)と、オーバーフローしてしまって
正しい処理ができないので

あと64bitの環境(Linux+gcc+Athlon64)では↑のようなことはおきないのかな・・・。
>>806
>C言語で32bit(4,294,967,295)を超える計算はできないのでしょうか?

質問がおかしいね。そういうのがない環境に作り込むための言語だよ。
long long を使え。
64bitでも足りないなら GNU MP でも使え。
>>806
C の新しい規格 C99 では long long int 型があって、
それを使えば 64 bits (厳密には 64 bits 以上)で計算できる。
C99 でなくてもコンパイラごとに拡張してある場合があるので
(VC++ だと __int64 、GCC だと long long だったはず)、
#if でコンパイラごとに分岐して、
64 bits 型を typedef してから使うと良い。

>>807
日本語がおかしいね。
多倍長演算すれば?
>>806 なら、
if(y == x * x) {
 {処理}
}
でいけるけどね。
というか、= と == を間違えてるぞ。