トップページ⇒tech
955コメント275KB

C言語なら、俺に聞け! <12>

■ このスレッドは過去ログ倉庫に格納されています
0001ウルトラハッカー 日下部陽一NGNG
おれは39才、22年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことならぜんてわかるから、疑問な点があったらオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

Cプログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するようなヤツはこれでも買え。
これでわからない、救いがたいヤツはあきらめろ。
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/qid%3D1005618315/250-3950205-1475419

・前スレ C言語なら、オレに聞け! <11>
http://pc.2ch.net/test/read.cgi/tech/1009499565/l50
0002丸投げNGNG
>>1
ぜんて?
0003デフォルトの名無しさんNGNG
しかし何でこのスレこんなに伸びてんだ?
ユーザーが少なくなのはわかるが
言語仕様・処理系・書籍なんかの情報的に
枯れきってるはずなのに...
0004名無しさん@EmacsNGNG
若返ってるよ??
0005デフォルトの名無しさんNGNG
C9Xで若返り?
0006デフォルトの名無しさんNGNG
>>3
voidがいたときに伸びたのはある意味わかるんだが…
0007デフォルトの名無しさんNGNG
>>3
FAQも読めない厨房が多いから。
0008デフォルトの名無しさんNGNG
>>3
> 言語仕様・処理系・書籍なんかの情報的に
> 枯れきってるはずなのに...
え、C++よりもJavaよりもCの方が新しい言語仕様ですが?
何か勘違いしてません?
0009デフォルトの名無しさんNGNG
>>8
どーするとそー読めますか?
0010デフォルトの名無しさんNGNG
>>9
私の言いたいことは

Cの言語仕様は最近新しくなったし、
それに伴って処理系も新しくなるだろうし、
書籍も次々に新しい本が出版されているし、
Cは決して枯れきっているわけではないことが言いたいんですが、
何か反論ありますか?
0011名無しさん@EmacsNGNG
しかしこのスレの質問レベルはちっとも進歩してないぞ。
0012デフォルトの名無しさんNGNG
環境非依存なCスレの質問なんて、大概決まってるだろ。
malloc&freeでも延々やりたいのか?
0013デフォルトの名無しさんNGNG
9>10
ああ、枯れきってないってことですか。ならわかります。
言語仕様が新しい、は、ま、いいでしょう。
0014デフォルトの名無しさんNGNG
>>12
まあ入門者が質問してくる内容も大体決まってるわけで。
0015デフォルトの名無しさんNGNG
C マガジンが年中初心者向けの連載をしている事実。
0016デフォルトの名無しさんNGNG
そして、教えてもらった初心者がすぐに教える方になろうとして…(以下繰り返し)
0017デフォルトの名無しさんNGNG
C言語講座ってのはもっと殺伐としてるべきなんだよ。
初心者はすっこんでろ。
0018 NGNG
strdup("aaa");
で作った配列はいつフリーするよ?
関数の中で使っちまうとフリーできないじゃん。
0019デフォルトの名無しさんNGNG
malloc(n);
で作った配列はいつフリーするよ?
関数の中で使っちまうとフリーできないじゃん。
0020デフォルトの名無しさんNGNG
>>18
真性DQNハケーン!!!
一生VBでも使ってろ(w
0021デフォルトの名無しさんNGNG
Ruby以外の言語は糞
0022デフォルトの名無しさんNGNG
MPEGプレイヤーを作りたいのですが、
C言語でも作れますか?
よろしくお願いします。
0023 NGNG
>>18
関数の中で使わなきゃいいじゃん(W
0024デフォルトの名無しさんNGNG
main()も関数ですが(w
いい感じに殺伐してるな(笑
0025デフォルトの名無しさんNGNG
>>22 smpeg
0026デフォルトの名無しさんNGNG
>25さん
レスありがとうございます。聞いたことのない言葉なのでちょっと今
検索してみたのですが、やはり一筋縄ではいかないようですね。
SMPEGについてもう少し詳しく勉強してみます。
ありがとうございました。
002718NGNG
なんだよぉ!!
教えてくれてもいいじゃないかぁ。
ぷんぷん!
0028デフォルトの名無しさんNGNG
>>19
 こんな感じでやったら?

void func()
{
struct str {
 char *p;
~ str(){ free(p) ;};
} s;
s.p= strdup("aaa") );

 ・・・この後 s.pを使う・・・
}
0029デフォルトの名無しさんNGNG
そーゆー初心者に判りづらいネタはやめとけよ
0030デフォルトの名無しさんNGNG
>18
使い終わったらfree()しる!
0031デフォルトの名無しさんNGNG
真性厨房です。
いかのコードはなぜうまくいかないのでしょうか?

#include <stdio.h>

char *getStr()
{
char buf[] = "HELLO";
return buf;
}

int main(void)
{
char *str;

str = getStr();
printf("%s\n", str);
return (0);
}

0032デフォルトの名無しさんNGNG
>>31
FAQ you!!!
0033デフォルトの名無しさんNGNG
>>31
> いかのコードはなぜうまくいかないのでしょうか?
変数のスコープと寿命を良く理解していないから。
0034デフォルトの名無しさんNGNG
>>31
うまくいってます。
ただ、あなたの思った結果と違うだけです。
>>1のC FAQ 日本語訳 、良く読みましょう。
0035デフォルトの名無しさんNGNG
どうしても わからないのですが
fgetsが挙動不審になります・・・

getsはscanfと一緒につかうのはだめだ ってことはわかっているのですが
fgetsはなにか かみ合わせのわるい関数があるのでしょうか
もちろんscanfは読み取っていません
fgets(str,100,stdin) のような感じで いくつかつかっているのですが
発動するところと それをシカトしてとおりすぎていってしまう
場所があるんです
if文の中にあるとかそういうことではなくて、
必ず発動する場所においてあるのですが・・・
003635NGNG
理由がよくわからないのですが
1度エンターキーを押すと なぜか連打されてるとみなされて
次にあるfgetsが作動しなかったみたいです
あるていどcscanfに変えたら作動するようになりました(fgetsとcscanf混在で)
なんでだろう・・・
003720NGNG
>>27
K&R読みかえせ、ボケ。

なんて言っても、そもそもこいつ、
一度も読んだ事無いんだろうな(w
0038デフォルトの名無しさんNGNG
>>31
なぜ、return "HELLO";にしないの?
003931NGNG
32〜34
サンクスです。分かりました。
0040デフォルトの名無しさんNGNG
>>35、>>36
きっと余計なものまで読み込んでいるんじゃない?
0041デフォルトの名無しさんNGNG
>>40
同じ現象を再現できる短いコードを載せると、見てるほうもわかりやすい。
004235NGNG
>>40,>>41
すこし長くなってしまいますが
ソースの一部分だけこぴぺしました
cscanfにして解決したのですが fgetsでやると どうにもうまくいかないです
関数自体は発動するのですが・・・

cscanf("%d",&select); ←ここをfgetsにすると inputs関数内の最初のfgetsをよみとらないです
if(select<1 || select>6){
printf("1から6までの数を入力してください。\n");
return; //強制的にもう一度メニューを出す。
}

switch(select){
case 1: inputs(0); //Yを入れてるのに特に意味はない 再帰でつかいたかっただけ。
break;
case 2: bookserch(0);
break;
case 3: nameserch(0);
break;
case 4: save();
break;
case 5: load();
break;
case 6: exit(0);
break;
}

}




char inputs(char temp){
char str[100],ch='0';

if(temp=='N'){return temp;} //再帰から抜ける。


//書籍名の入力 配列への代入
printf("書籍名を入力して下さい。100文字まで許容します\n");
fgets(str,100,stdin); ←これを読み取らない

if(str[strlen(str)-1]=='\n') str[strlen(str)-1]='\0'; //改行をNULLへ
strcpy(book[nowMAX][0],str);

//著者名の入力 配列への代入
printf("著者名を入力してください。同じく100文字まで許容します\n");
fgets(str,100,stdin); ←これは読み取る
0043デフォルトの名無しさんNGNG
>>42
原因はストリームに、ゴミが残ってるせいだと思うのですが、
見た感じだと、fgets()を連続して呼んでるだけなんで、
問題ないように思いますが...

環境がわからないのでなんともいえませんが、改行コードが
おかしくなってるとか、そういうことは無いですか?
0044デフォルトの名無しさんNGNG
>>42
bookが char book[BOOK_MAX][MAX_BOONAME_LEN]; とかだとしたら
strcpy(book[nowMAX][0],str);
     ↓
strcpy(book[nowMAX],str);

それとも、fgets()で入力待ち状態にさえならないってことですかー?
FreeBSDで試しましたが、上のとこ直したら、ちゃんとうごいていますよー
0045デフォルトの名無しさんNGNG
改行コードを消すにはこれをやれ
string[strlen(string) - 1] = '\0';
004644NGNG
>>42
あ、char book[MAX_BOOK][MAX_ELEMENTS][MAX_LEN]; で
book[本の番号][0] が書名
book[本の番号][1] が著者名
でしょうか?だとしたら漏れの勘違い。スマソ。
0047デフォルトの名無しさんNGNG
>>45
>>42はそうなってるんじゃ?

>>42
cscanf()のとこをfgets()に置き換えた例をキボン。
0048デフォルトの名無しさんNGNG
>>42
「読み込まない」ってのはどうやって確認した?
0049yacc聞いてもいいですかNGNG
yaccで、
expr : expr1 expr2
と書いて、expr2の処理を先に実行させる方法があるでしょうか。
その結果をexpr1の処理の中で使いたいんです。
0050C初心者NGNG
昔のBASICのプログラムをCで書き直すときに
BASICのコマンド(予約語)をCの関数にして
おけばいいとふと思ったのですが根本的に間
違っているような気もします.いかがなもの
でしょうか.
0051初心モノNGNG
 Cで,RS232C接続でパケット通信をするプログラムを書くときの作法みたいなもの
ありますか?綺麗に書くコツみたいなものがしりたいのですが,参考になる図書,Webでも
結構ですので,教えてください.よろしくお願いします.
0052デフォルトの名無しさんNGNG
>>50
間違ってはいないけど大変そうだね。
005335NGNG
43-38>>
いろいろ回答ありがとうございます
まず変数事態は
book[nowMAX][0]書籍名
book[nowMAX][1]書籍名の
配列テーブルです
それで fgetsは入力待ち状態にもなりません
cprintfをfgetsに置き換えて・・・っていうのは
他でやってるのと同じように
fgetsでまず文字配列に 代入して
改行コードNULL文字に変えて そのあとatoiで整数にしてselectに代入
という手順を踏んでます
で、最初に関数に飛んだときは 1つめのfgetsが発動しなくて
2つめのfgetsは発動するんです。
そして その関数の中で再帰して同じ関数を呼んでいるのですが
その再帰した関数では1つ目も2つ目も正常に働くんです
いったい 最初にfgetsがはたらかないのは なにが原因なのかと・・・
005435NGNG
53>>
43-48>>でした すいません タイプみすです(汗
005535NGNG
あ ちなみに環境はVC++6 です。
005635NGNG
本当に何回も連続投稿すみません・・・
book[nowMAX][0]書籍名
book[nowMAX][1]著者名
の配列テーブルです 
0057デフォルトの名無しさんNGNG
>>50
機械的にコンバートするツール作るのなら
そんな風なしくみにすると楽だろうけど

手でやるならやってるうちに馬鹿らしくなってすぐ手抜き
(ていうか普通の移植)するだろうね。
0058デフォルトの名無しさんNGNG
>>53
デバッガは使える?
失敗するfgets()のあたりで止めて、入力される値とリターン値を確認してみそ。

ちなみに、うちの環境(VC6)で、fgets()を続けてコールしても、普通に動いてました。

char s[100];
printf("入力して下さい。\n");
fgets(s, sizeof s, stdin);

printf("入力して下さい。\n");
fgets(s, sizeof s, stdin);
printf("%s\n", s);
0059デフォルトの名無しさんNGNG
>>50
何のために書き直すの?
0060仕様書無しさんNGNG
>>50
根本的に間違いです。
同じ名前の単語を作っても、文法が違うんだから
なにも解決しないよ。
(´−`).。oO( BASIC言語のインタプリタを作っちゃうっていうなら、いいけど。 ) 
006147NGNG
>>53
cscanf()を置き換えたfgets()なんだけど、1文字入力だからって、
fgets(buf,2,stdin);
とかしてないよねー?
(第2引数の値をいくつにしたのか知りたい)
0062C初心者NGNG
レスありがとうございました。BASICのプログラムが
たくさんあって毎日使っていますがF-BASICとか無く
なったら困るかな…と思いまして。
>>60
ああ巨大な盲点が…
0063デフォルトの名無しさんNGNG
>>62
代用できるフリーのBASICってないの?
OSのバージョンアップでF-BASICが使えなくなりました、って
ありそうな感じ。
006435NGNG
>>58
デバッガつかえないんです・・・
VC++は本当にエディタとコンパイラしかつかってなくて・・・
VC++自体の勉強ももう少ししなければならないですね
まだC言語をやり始めて半月なので 超初心者なんです
ですが とっとと初心者脱出のためにがんばります

>>61
いえ あとで選択肢を増やそうとおもっていたので
第二引数の値は10にしてありました
0065デフォルトの名無しさんNGNG
>>62 Basicのソースなら VBとかDelphiの方が楽だろうに
0066デフォルトの名無しさんNGNG
?
Basic→Visual Basicは楽かもしれんが、
Basic→Delphi(Object Pascal)はBasic→Cと大差ないと思われ
0067デフォルトの名無しさんNGNG
wchar_tについて教えてください。
Cのランタイムはwchat_tが1つにつき1文字としているようなのですが、
UNICODE関係を説明したページによると
UTF-16は2バイト、または4バイトで1文字を表現するとなっていました。
今までwchat_tはUTF-16の文字のことだと思っていたのですが、
そうなると、wchat_tが1つにつき1文字とは限らないということになってしまいます。
4バイトで1文字を表している場合、どのように処理すればよいのでしょうか。
それとももしかしてwchat_t!=UTF-16文字なのでしょうか。
0068デフォルトの名無しさんNGNG
>>67
wchar_tがUnicodeとは気マット欄。
0069デフォルトの名無しさんNGNG
wchar_t がどんな文字コードかってのは処理系依存でわ。
勝手にUnicode系列と仮定してはいけません。
007067NGNG
>>68-69
そうだったんですか・・・。
Windows&VC++上でとりあえずいけてたのでそう思っていたのですが、違う可能性もあるのですね。
ありがとうございました、大変勉強になりました!
0071デフォルトの名無しさんNGNG
Solaris では wchar_t が4バイトだった気がする。
007267NGNG
>>71
マジですか(;´Д`)
0073デフォルトの名無しさんNGNG
EUCの固定幅の文字列が入ってる場合もあるな。
wchar_tに何が入るかはロケール依存だよ。
たまたまWindowsではどのロケールでもUnicodeなだけ。
0074デフォルトの名無しさんNGNG
あげ
0075デフォルトの名無しさんNGNG
HP-UXでは4byte、bcc55では2byteだな > wchar_t
Cではintでもサイズは処理系依存だからな
0076私は31ではありませんが・・・NGNG
>>31がどうして上手くいかないのか分かりません。
気になってしょうがないので、どなたか教えてください。
0077デフォルトの名無しさんNGNG
>>76
ローカル変数buf[]はgetStr()から戻った時点で
スタックから消滅するからだ。

ちなみに
char buf[] = "HELLO";
を
char *buf = "HELLO";
にすればうまくいくだろう。
0078デフォルトの名無しさんNGNG
>>76
[]と""
0079仕様書無しさんNGNG
>>76
ていうか、戻り値はポインタ型だろ。
で、ポインタが参照している先を見に行くと、
(定義されていたはずの文字列データはスコープが期限切れになって
蒸発しちゃったので)なにも見えなくて当然。
0080デフォルトの名無しさんNGNG
char *buf = "HELLO";
これの他には
用は値が残ってりゃいいのだから
static char buf[]="HELLO";
でも良い。
008176NGNG
>>77
なるほど、上手く動きました。
ありがとうございました。

つまり、たしかにbuf[]の先頭アドレスをmainへ渡してはいるが、
mainに戻った時点で既にスタックが消え去ってしまっている。
ということですね?
008276NGNG
おっと、こんなにレスが!
みなさんありがとうございます。
008376NGNG
>>80
勉強になりました。ありがとうございます。
0084デフォルトの名無しさんNGNG
連続して(例えばscanfで)入力を受け付けると、
ストリームに\0が残っているので、
1回目のscanfと2回目のscanfの間にはダミー変数に
\0を読ませなければならない、と聞きましたが、
以下のコードは思った通り(?)に動きます。
ご教授頂けませんか?
ちなみにコンパイラはgcc、OSはFreeBSDです。

#include <stdio.h>

int
main(void)
{

int n1,n2;

printf("Please enter a number:\n");
scanf("%d",&n1);
printf("Please enter the other number:\n");
scanf("%d",&n2);
printf("Your entered number are: %d %d\n",n1,n2);

return 0;

}
0085デフォルトの名無しさんNGNG
>>84
一回目の入力値に数値でない入力をするとどうなる?
二回目の入力値をすっ飛ばさないか?
それは君の「思った通りの動作」なのか?
008684NGNG
>>85
レスありがとうございます。
2回目の入力をchar型の変数を受け付けるようにすると、
入力をすっ飛ばしました
(こうなることを期待していた、というかそう習いました)。
でもなんで2回目の入力をint型で受け付けたら
入力をすっ飛ばさないのですか?
0087名無しさんNGNG
質問です。
Visual StudioのVisual C++でグラフィックのプログラムを
本を見ながら作成したのですが、
コンパイルとすると、#include<graph.h>のヘッダーファイルが
開けないというメッセージが出るのですがどうすればいいのでしょうか?

0088デフォルトの名無しさんNGNG
graph.hなんてあったっけ?
俺つかったことねーや
0089デフォルトの名無しさんNGNG
>>87

graph.hがないからでは?

Cの標準ライブラリにgraph.hはない。
したがってそれは拡張ライブラリであって、すべての環境に
存在しているわけではない。
0090名無しさんNGNG
>>89
なるほど。
graph.hがなしでグラフィック処理はできるのですか?
0091デフォルトの名無しさんNGNG
>>90
できる。
やりかたは、いろいろある。
VCのマニュアルや、マイクロソフトのホームページや
市販の参考書をみればいくらでも。
0092デフォルトの名無しさんNGNG
本って、なに見ながらつくってんだ?
0093デフォルトの名無しさんNGNG
>>86
bcc32で試してみたけど
Please enter a number:
hoge  ← これを入力
Please enter the other number:
Your entered number are: 0 0
ってならない?

期待した動作って
Please enter a number:
hoge  ← これを入力
Please enter the other number:
10   ← ここでの入力が可能
Your entered number are: 0 10
ではないの?
009484NGNG
>>93
習った事を試してみたかったので、84のプログラムで、

Please enter a number:
hoge  ← これを入力
Please enter the other number:
Your entered number are: 0 0

となって欲しかったんですが、

Please enter a number:
0   ← これを入力
Please enter the other number:
10   ← ここでの入力が可能
Your entered number are: 0 10

となったからびっくりしたんです。
どういう事なんでしょう?
0095名無しさんNGNG
>>92
学校にあった、初心者用のCのテキストです
0096デフォルトの名無しさんNGNG
>>94
わからない。
ちなみにSunOS+gccでも
> Please enter a number:
> hoge  ← これを入力
> Please enter the other number:
> Your entered number are: 0 0
となる
FreeBSDは今手元にないので確認できない
009784NGNG
>>96
てことはそんなに私がすごい勘違いをしているわけではないのですね。
ちょっと安心しました。

みなさんいろいろありがとうございました。
0098デフォルトの名無しさんNGNG
$ ./a.out
Please enter a number:
0
Please enter the other number:
1
Your entered number are: 0 1
$ ./a.out
Please enter a number:
hoge
Please enter the other number:
Your entered number are: 134518476 134518256

>>84
おわかりか?
0099デフォルトの名無しさんNGNG
ついでだから
$ ./a.out
Please enter a number:
12 34
Please enter the other number:
Your entered number are: 12 34
$ ./a.out
Please enter a number:
23hoge
Please enter the other number:
Your entered number are: 23 134518256
0100デフォルトの名無しさんNGNG
関係ないけど、 numbers are にしてほしい也
010184NGNG
>>98,99
それは単にint型の変数にcharが入るからじゃないんですか?
■ このスレッドは過去ログ倉庫に格納されています