C言語なら、俺に聞け! <12>
■ このスレッドは過去ログ倉庫に格納されています
0001ウルトラハッカー 日下部陽一
NGNGいろいろな言語を極めたが、一番手になじむのは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ぜんて?
0003デフォルトの名無しさん
NGNGユーザーが少なくなのはわかるが
言語仕様・処理系・書籍なんかの情報的に
枯れきってるはずなのに...
0004名無しさん@Emacs
NGNG0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNGvoidがいたときに伸びたのはある意味わかるんだが…
0007デフォルトの名無しさん
NGNGFAQも読めない厨房が多いから。
0008デフォルトの名無しさん
NGNG> 言語仕様・処理系・書籍なんかの情報的に
> 枯れきってるはずなのに...
え、C++よりもJavaよりもCの方が新しい言語仕様ですが?
何か勘違いしてません?
0009デフォルトの名無しさん
NGNGどーするとそー読めますか?
0010デフォルトの名無しさん
NGNG私の言いたいことは
Cの言語仕様は最近新しくなったし、
それに伴って処理系も新しくなるだろうし、
書籍も次々に新しい本が出版されているし、
Cは決して枯れきっているわけではないことが言いたいんですが、
何か反論ありますか?
0011名無しさん@Emacs
NGNG0012デフォルトの名無しさん
NGNGmalloc&freeでも延々やりたいのか?
0013デフォルトの名無しさん
NGNGああ、枯れきってないってことですか。ならわかります。
言語仕様が新しい、は、ま、いいでしょう。
0014デフォルトの名無しさん
NGNGまあ入門者が質問してくる内容も大体決まってるわけで。
0015デフォルトの名無しさん
NGNG0016デフォルトの名無しさん
NGNG0017デフォルトの名無しさん
NGNG初心者はすっこんでろ。
0018
NGNGで作った配列はいつフリーするよ?
関数の中で使っちまうとフリーできないじゃん。
0019デフォルトの名無しさん
NGNGで作った配列はいつフリーするよ?
関数の中で使っちまうとフリーできないじゃん。
0020デフォルトの名無しさん
NGNG真性DQNハケーン!!!
一生VBでも使ってろ(w
0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNGC言語でも作れますか?
よろしくお願いします。
0023
NGNG関数の中で使わなきゃいいじゃん(W
0024デフォルトの名無しさん
NGNGいい感じに殺伐してるな(笑
0025デフォルトの名無しさん
NGNG0026デフォルトの名無しさん
NGNGレスありがとうございます。聞いたことのない言葉なのでちょっと今
検索してみたのですが、やはり一筋縄ではいかないようですね。
SMPEGについてもう少し詳しく勉強してみます。
ありがとうございました。
002718
NGNG教えてくれてもいいじゃないかぁ。
ぷんぷん!
0028デフォルトの名無しさん
NGNGこんな感じでやったら?
void func()
{
struct str {
char *p;
~ str(){ free(p) ;};
} s;
s.p= strdup("aaa") );
・・・この後 s.pを使う・・・
}
0029デフォルトの名無しさん
NGNG0030デフォルトの名無しさん
NGNG使い終わったら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デフォルトの名無しさん
NGNGFAQ you!!!
0033デフォルトの名無しさん
NGNG> いかのコードはなぜうまくいかないのでしょうか?
変数のスコープと寿命を良く理解していないから。
0034デフォルトの名無しさん
NGNGうまくいってます。
ただ、あなたの思った結果と違うだけです。
>>1のC FAQ 日本語訳 、良く読みましょう。
0035デフォルトの名無しさん
NGNGfgetsが挙動不審になります・・・
getsはscanfと一緒につかうのはだめだ ってことはわかっているのですが
fgetsはなにか かみ合わせのわるい関数があるのでしょうか
もちろんscanfは読み取っていません
fgets(str,100,stdin) のような感じで いくつかつかっているのですが
発動するところと それをシカトしてとおりすぎていってしまう
場所があるんです
if文の中にあるとかそういうことではなくて、
必ず発動する場所においてあるのですが・・・
003635
NGNG1度エンターキーを押すと なぜか連打されてるとみなされて
次にあるfgetsが作動しなかったみたいです
あるていどcscanfに変えたら作動するようになりました(fgetsとcscanf混在で)
なんでだろう・・・
0038デフォルトの名無しさん
NGNGなぜ、return "HELLO";にしないの?
003931
NGNGサンクスです。分かりました。
0041デフォルトの名無しさん
NGNG同じ現象を再現できる短いコードを載せると、見てるほうもわかりやすい。
004235
NGNGすこし長くなってしまいますが
ソースの一部分だけこぴぺしました
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原因はストリームに、ゴミが残ってるせいだと思うのですが、
見た感じだと、fgets()を連続して呼んでるだけなんで、
問題ないように思いますが...
環境がわからないのでなんともいえませんが、改行コードが
おかしくなってるとか、そういうことは無いですか?
0044デフォルトの名無しさん
NGNGbookが char book[BOOK_MAX][MAX_BOONAME_LEN]; とかだとしたら
strcpy(book[nowMAX][0],str);
↓
strcpy(book[nowMAX],str);
それとも、fgets()で入力待ち状態にさえならないってことですかー?
FreeBSDで試しましたが、上のとこ直したら、ちゃんとうごいていますよー
0045デフォルトの名無しさん
NGNGstring[strlen(string) - 1] = '\0';
004644
NGNGあ、char book[MAX_BOOK][MAX_ELEMENTS][MAX_LEN]; で
book[本の番号][0] が書名
book[本の番号][1] が著者名
でしょうか?だとしたら漏れの勘違い。スマソ。
0047デフォルトの名無しさん
NGNG>>42はそうなってるんじゃ?
>>42
cscanf()のとこをfgets()に置き換えた例をキボン。
0048デフォルトの名無しさん
NGNG「読み込まない」ってのはどうやって確認した?
0049yacc聞いてもいいですか
NGNGexpr : expr1 expr2
と書いて、expr2の処理を先に実行させる方法があるでしょうか。
その結果をexpr1の処理の中で使いたいんです。
0050C初心者
NGNGBASICのコマンド(予約語)をCの関数にして
おけばいいとふと思ったのですが根本的に間
違っているような気もします.いかがなもの
でしょうか.
0051初心モノ
NGNGありますか?綺麗に書くコツみたいなものがしりたいのですが,参考になる図書,Webでも
結構ですので,教えてください.よろしくお願いします.
0052デフォルトの名無しさん
NGNG間違ってはいないけど大変そうだね。
005335
NGNGいろいろ回答ありがとうございます
まず変数事態は
book[nowMAX][0]書籍名
book[nowMAX][1]書籍名の
配列テーブルです
それで fgetsは入力待ち状態にもなりません
cprintfをfgetsに置き換えて・・・っていうのは
他でやってるのと同じように
fgetsでまず文字配列に 代入して
改行コードNULL文字に変えて そのあとatoiで整数にしてselectに代入
という手順を踏んでます
で、最初に関数に飛んだときは 1つめのfgetsが発動しなくて
2つめのfgetsは発動するんです。
そして その関数の中で再帰して同じ関数を呼んでいるのですが
その再帰した関数では1つ目も2つ目も正常に働くんです
いったい 最初にfgetsがはたらかないのは なにが原因なのかと・・・
005435
NGNG43-48>>でした すいません タイプみすです(汗
005535
NGNG005635
NGNGbook[nowMAX][0]書籍名
book[nowMAX][1]著者名
の配列テーブルです
0057デフォルトの名無しさん
NGNG機械的にコンバートするツール作るのなら
そんな風なしくみにすると楽だろうけど
手でやるならやってるうちに馬鹿らしくなってすぐ手抜き
(ていうか普通の移植)するだろうね。
0058デフォルトの名無しさん
NGNGデバッガは使える?
失敗する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何のために書き直すの?
0060仕様書無しさん
NGNG根本的に間違いです。
同じ名前の単語を作っても、文法が違うんだから
なにも解決しないよ。
(´−`).。oO( BASIC言語のインタプリタを作っちゃうっていうなら、いいけど。 )
006147
NGNGcscanf()を置き換えたfgets()なんだけど、1文字入力だからって、
fgets(buf,2,stdin);
とかしてないよねー?
(第2引数の値をいくつにしたのか知りたい)
0063デフォルトの名無しさん
NGNG代用できるフリーのBASICってないの?
OSのバージョンアップでF-BASICが使えなくなりました、って
ありそうな感じ。
006435
NGNGデバッガつかえないんです・・・
VC++は本当にエディタとコンパイラしかつかってなくて・・・
VC++自体の勉強ももう少ししなければならないですね
まだC言語をやり始めて半月なので 超初心者なんです
ですが とっとと初心者脱出のためにがんばります
>>61
いえ あとで選択肢を増やそうとおもっていたので
第二引数の値は10にしてありました
0065デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNGBasic→Visual Basicは楽かもしれんが、
Basic→Delphi(Object Pascal)はBasic→Cと大差ないと思われ
0067デフォルトの名無しさん
NGNGCのランタイムは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デフォルトの名無しさん
NGNGwchar_tがUnicodeとは気マット欄。
0069デフォルトの名無しさん
NGNG勝手にUnicode系列と仮定してはいけません。
007067
NGNGそうだったんですか・・・。
Windows&VC++上でとりあえずいけてたのでそう思っていたのですが、違う可能性もあるのですね。
ありがとうございました、大変勉強になりました!
0071デフォルトの名無しさん
NGNG0073デフォルトの名無しさん
NGNGwchar_tに何が入るかはロケール依存だよ。
たまたまWindowsではどのロケールでもUnicodeなだけ。
0074デフォルトの名無しさん
NGNG0075デフォルトの名無しさん
NGNGCではintでもサイズは処理系依存だからな
0076私は31ではありませんが・・・
NGNG気になってしょうがないので、どなたか教えてください。
0077デフォルトの名無しさん
NGNGローカル変数buf[]はgetStr()から戻った時点で
スタックから消滅するからだ。
ちなみに
char buf[] = "HELLO";
を
char *buf = "HELLO";
にすればうまくいくだろう。
0078デフォルトの名無しさん
NGNG[]と""
0079仕様書無しさん
NGNGていうか、戻り値はポインタ型だろ。
で、ポインタが参照している先を見に行くと、
(定義されていたはずの文字列データはスコープが期限切れになって
蒸発しちゃったので)なにも見えなくて当然。
0080デフォルトの名無しさん
NGNGこれの他には
用は値が残ってりゃいいのだから
static char buf[]="HELLO";
でも良い。
008176
NGNGなるほど、上手く動きました。
ありがとうございました。
つまり、たしかにbuf[]の先頭アドレスをmainへ渡してはいるが、
mainに戻った時点で既にスタックが消え去ってしまっている。
ということですね?
008276
NGNGみなさんありがとうございます。
008376
NGNG勉強になりました。ありがとうございます。
0084デフォルトの名無しさん
NGNGストリームに\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一回目の入力値に数値でない入力をするとどうなる?
二回目の入力値をすっ飛ばさないか?
それは君の「思った通りの動作」なのか?
008684
NGNGレスありがとうございます。
2回目の入力をchar型の変数を受け付けるようにすると、
入力をすっ飛ばしました
(こうなることを期待していた、というかそう習いました)。
でもなんで2回目の入力をint型で受け付けたら
入力をすっ飛ばさないのですか?
0087名無しさん
NGNGVisual StudioのVisual C++でグラフィックのプログラムを
本を見ながら作成したのですが、
コンパイルとすると、#include<graph.h>のヘッダーファイルが
開けないというメッセージが出るのですがどうすればいいのでしょうか?
0088デフォルトの名無しさん
NGNG俺つかったことねーや
0089デフォルトの名無しさん
NGNGgraph.hがないからでは?
Cの標準ライブラリにgraph.hはない。
したがってそれは拡張ライブラリであって、すべての環境に
存在しているわけではない。
0090名無しさん
NGNGなるほど。
graph.hがなしでグラフィック処理はできるのですか?
0091デフォルトの名無しさん
NGNGできる。
やりかたは、いろいろある。
VCのマニュアルや、マイクロソフトのホームページや
市販の参考書をみればいくらでも。
0092デフォルトの名無しさん
NGNG0093デフォルトの名無しさん
NGNGbcc32で試してみたけど
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
ではないの?
009484
NGNG習った事を試してみたかったので、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学校にあった、初心者用のCのテキストです
0096デフォルトの名無しさん
NGNGわからない。
ちなみにSunOS+gccでも
> Please enter a number:
> hoge ← これを入力
> Please enter the other number:
> Your entered number are: 0 0
となる
FreeBSDは今手元にないので確認できない
009784
NGNGてことはそんなに私がすごい勘違いをしているわけではないのですね。
ちょっと安心しました。
みなさんいろいろありがとうございました。
0098デフォルトの名無しさん
NGNGPlease 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デフォルトの名無しさん
NGNG010184
NGNGそれは単にint型の変数にcharが入るからじゃないんですか?
■ このスレッドは過去ログ倉庫に格納されています