トップページ⇒tech
1001コメント315KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/04/29(火) 09:44:57
言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 26
http://pc11.2ch.net/test/read.cgi/tech/1206196600/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 105代目
http://pc11.2ch.net/test/read.cgi/tech/1208268461/
0153デフォルトの名無しさん2008/05/02(金) 02:19:13
スレ違い
0154デフォルトの名無しさん2008/05/02(金) 02:25:20
ttp://www.google.co.jp/search?q=EOF%E3%80%80%E5%85%A5%E5%8A%9B&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t
EOFの入力は余裕で可能です、ありがとうございますた。
0155デフォルトの名無しさん2008/05/02(金) 02:36:35
入力の終わりを通知することを「EOFを入力する」と定めるなら、余裕で可能です。
0156デフォルトの名無しさん2008/05/02(金) 02:47:55
この前だってそういう話で終わったじゃないか。
0157デフォルトの名無しさん2008/05/02(金) 03:01:33
荒らしに付き合うやつも荒らし
キチガイに付き合うやつもキチガイ
0158デフォルトの名無しさん2008/05/02(金) 03:38:01
getchar()が云々はどうでも良い。キーボードから入力が可能です
当然EOFコードを検出するのに、ファイルの終わりを示している
コードを使うのもありです、本当に本当に、重ね重ね、ありがとうございますた!
0159デフォルトの名無しさん2008/05/02(金) 09:40:33
□!!!これを見た貴方は3日以内に死にます!!!■
■死にたくなければ、このレスをコピーして他のスレに □
□10回貼り付けて下さい。1時間以内にです!もし無 ■
■した場合は、今日寝ている間に富子さんがやってきて□
□貴方の首を絞めに来ます。富子さんは太平洋戦争の■
■時に16歳という若さで亡くなった女の子で、未だに成 □
□仏していないそうです。信じる信じないは貴方次第。 ■
■今年になってからこのレスを無視した人で、“呪われ □
□て死亡した人”が続出しています。これは富子さんの ■
■呪い。呪われて死んでもいいのならこれを無視するこ□
□とでしょうね。                        ■
■――貴方がこうしているうちに富子さんが後ろから見□
□ていますよ…。                       ■
■□■□■□■□■□■□■□■□■□■□■□■□
0160デフォルトの名無しさん2008/05/02(金) 11:08:02
おまえらがくだらん煽りあいをしてると初心者の人が質問しにくいだろ
0161その1は宿題スレね2008/05/02(金) 11:30:28
どうせここは隔離スレ(その2)だからどうでもいいよ。
0162デフォルトの名無しさん2008/05/02(金) 21:51:56
一つ目のウィンドウにHello、二つ目のウィンドウにWorld を表示させるにはどうすればいいんでしょう?
0163デフォルトの名無しさん2008/05/02(金) 21:53:07
レベル7のエスパーを求む!
0164デフォルトの名無しさん2008/05/02(金) 21:53:47
>>152
何か切れてる? Unixなら伝統的に ^D = EOF
そそ、だからといって通常に ^D (0x04) が現れても EOF にはならないよ。
とにかくファイルに EOF というコードが有ると勘違いしるのかとおもった。

>>160 おっと、すまん。そのとおりだ。
0165デフォルトの名無しさん2008/05/02(金) 22:07:28
>>164
どのOSならとかどーでも良いんじゃい(竹原風に)
キーボードからの入力は可能だし、EOFはマクロで値が定義されているし
なんならそれに応じた入力をしてやりゃ良いんだよ。所詮俺らが視覚的に
見えているものは、デジタルデータ、0と1の組み合わせの符号、信号。
0166デフォルトの名無しさん2008/05/02(金) 22:52:18
配列の宣言時に[]の中に変数って使えないんだっけ?
char num[sum];
みたいな
0167デフォルトの名無しさん2008/05/02(金) 22:52:54
>>166
C99じゃあるまいし
0168デフォルトの名無しさん2008/05/02(金) 22:54:49
>>163
すまない。俺はまだレベル6だ
0169デフォルトの名無しさん2008/05/02(金) 23:02:16
つまりC99では使えると
0170デフォルトの名無しさん2008/05/02(金) 23:06:20
「可変長配列」この辺かな
ttp://seclan.dll.jp/c99d/c99d04.htm#dt19990719
0171デフォルトの名無しさん2008/05/02(金) 23:14:11
>>170
そのページのsizeofのところでふいたw
図からわかるようにって、代入しただけで何がわかるんだよ
0172デフォルトの名無しさん2008/05/02(金) 23:16:40
>>171
図の中のコメントに代入されるはずの値が書いてあるから
それを見ろということだろ。
0173デフォルトの名無しさん2008/05/02(金) 23:23:54
>>166
結論からいうと変数は使えない・・・ので malloc alloc がある。

char* num = (char*)malloc(num*sizeof(char));
...
*(num+5) = 5; // or num[5] = 0; // みたいな...
...
free(num);
0174デフォルトの名無しさん2008/05/02(金) 23:26:19
C99では使えるっつーの。
0175デフォルトの名無しさん2008/05/02(金) 23:32:18
>>165
どうも何かごかいしているね。
EOF = (-1) が定義されているとしてこの -1 は入力できない値(int)なのよ。getchar() などが EOF と判断した条件の時に文字として存在しない値 (int)-1 0xffff あるいは 0xffffffff が返されるものなのだから。。。判るかな?
0176デフォルトの名無しさん2008/05/02(金) 23:37:27
>>175
君ね、いい加減鬱陶しい。マクロを知らないのか?所詮、プログラム言語も仕様も
人間が都合よく定義、規格化しているだけ。EOFがどうとかどうでも良いんじゃい。
所詮 数値データ だと何度も言っているだろ。あとはマクロを使うことで
より幅広い環境で通用するという話。いい加減、大学にも通ってないような
低レベルとは話はしたくないんで。
0177デフォルトの名無しさん2008/05/02(金) 23:38:13
>>174
使えた。
0178デフォルトの名無しさん2008/05/02(金) 23:39:06
>>175
> この -1 は入力できない値(int)なのよ
これだけ取り出しても、こいつが相当な勘違い野郎だということがはっきりしたな。
入力の意味も広義で説明されていたというのに。ねぇ、こういう知ったかが
どこか政府が運営する機関の関係者にいたらどう思う?マジでやべーよ。
まぁ、こんな似非理系は当然、専門学校程度だろうけど。
0179デフォルトの名無しさん2008/05/02(金) 23:46:30
ttp://www.google.co.jp/search?q=EOF%E3%80%80%E5%85%A5%E5%8A%9B&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t
EOFの入力は余裕で可能です、ありがとうございますた。
0180デフォルトの名無しさん2008/05/02(金) 23:47:14
>>172
コメントの数字が正しいことはどうやって証明するんだよw
0181デフォルトの名無しさん2008/05/02(金) 23:48:12
>>180
…
0182デフォルトの名無しさん2008/05/02(金) 23:50:47
プログラムが扱う変数として、EOFの数値データをchar型などで扱うかまで
入力受付のライブラリを用いて話をするが、while(getchar()!=EOF); で
ループを止める際に、どうやって止めたいんだい、プログラムは?w
論点はそこじゃない。EOFが入力可能か?答えはYES。適切に処理しない
環境をいちいち持ち出されても迷惑。256色しか表現できない環境で
24ビット画像を正確に表示しようとしても無理なようにね。
くどいが、こんな目の前にある機械なんて、所詮人間がルール(規格)を決めて
定義されたとおりにコンピュータがデータを実装された能力に応じて
展開しているに過ぎない、人間が都合よく解釈できるように。
コンピュータには目の前の文字も画像も映像データも、0と1の塊にしか見えんよ。
あとは規則に則って処理しているだけ。
01831662008/05/02(金) 23:57:21
>>173
ありがとう
何故か、当然変数で宣言できると思っててエラーでまくってた
0184デフォルトの名無しさん2008/05/02(金) 23:57:49
>>178
そんなむきにならならなくても。
0185デフォルトの名無しさん2008/05/02(金) 23:59:05
>>175
> この -1 は入力できない値(int)なのよ
別にint型とは限らなくね?符号ありのchar型にも収まる数値だが?

#include <stdio.h>
int main(void) {
char a=EOF;
unsigned char b=EOF;
if(a==EOF) printf("a=EOF\n");
if(b==EOF) printf("b=EOF\n");
printf("a : %d / b : %d \n",a,b);
return 0;
}
0186デフォルトの名無しさん2008/05/03(土) 00:10:02
さすがにそれはないわw
0187デフォルトの名無しさん2008/05/03(土) 00:29:06
>>185
fgetc(), getc(), getchar() の返り値は int ですから、EOF (-1) はファイル中に存在する値でも
なければ、stdin から入力できる値でもないと思うのですが。
0188デフォルトの名無しさん2008/05/03(土) 00:30:53
>>185
ああ、ようやく普通の人にであえたきが・・。勘違い >>182 系に辟易だったので・・・
で、実はそうではない。上位ビットが負号を示すのに用いられてるわけだけど
負号無しの unsigned char の場合 0x00 = 0, 0xff = 255 になって
負号付きの signed char の 0x80 〜 0xff は -127 〜 -1 とするから -1 という意味合いはある。
だけどこの -1 を EOF とみてしまうと・・・それはとても困る。
なぜなら(0x00〜0xff) の範囲にあるものすべて扱えないといけないから。
(0xff)が出現するバイナリーファイルの入出力はできないって事になるでしょ?

キーボードなどから (int(-1)) を入力できないデバイスはどうしたらいいかって事になるけど何度も既出だけど ^D (0x04) を犠牲にしそれを終端と意味付け、これをみて intサイズの -1 を返すという決めをしてる。

例で挙げている char a = EOF; の行でコンパイラから警告がでていない?(オプションによるけども char = int とするときの警告文)
後の比較系は int に負号拡張されるから見かけ動くようにみえてしまうので誤解しやすい。
0x7f (char) が 0x0000007f (int) に・・・同じ値 127 となる。
0x80 (signed char) が 0xffffff80 (int) に・・同じ -127 となる。
0x80 (unsigned char) は 0x000080 (unsigned int) ・・ 128・・という具合に・・
上位ビットを負号ビットに割り当てたのは負号拡張がとても容易だから。
a b が printf に渡った時点で負号拡張された int となっているからね。
0189デフォルトの名無しさん2008/05/03(土) 00:32:33
#include <stdio.h>
int main(void) {
char a=EOF;
unsigned char b=EOF;
int aa=EOF;
unsigned int bb=EOF;
if(a==EOF) printf("a=EOF\n");
if(b==EOF) printf("b=EOF\n");
printf("a : %d / b : %u \n",a,b);
printf("aa : %d / bb : %u \n",aa,bb);
return 0;
}

後は受け付けた変数の型によって、それ相応に解釈されちゃってるけどね。
0190デフォルトの名無しさん2008/05/03(土) 00:44:20
>>188
暴れてるのは一人だけで、まともに相手にすると余計暴れるからスルーしてるだけ
0191デフォルトの名無しさん2008/05/03(土) 01:01:03
正直ここで何か聞こうかと思ってスレちょっと読んだが
「C言語きやすく質問おk」と書かれた扉を開けたら
腕組んでイライラした奴らがこっちを見て来た状況と同じくらい
質問しづらいんだが。
0192デフォルトの名無しさん2008/05/03(土) 01:22:02
喋り方がむかつくってだけで正しい意見に対して脊髄反射で反論始めるとこうなるって良い見本だなw
0193デフォルトの名無しさん2008/05/03(土) 01:33:53
>>183
おっ、丁寧に。サンプル間違ってたけどそこはなんだ。うまく修正してくれたわけか。C99 あるいは今の GNU C/C++系だと気付かなかった世界かもしれん。再変更する realloc もあるで。
0194デフォルトの名無しさん2008/05/03(土) 01:53:55
>>191
あ!?んだよ!?
0195デフォルトの名無しさん2008/05/03(土) 01:59:58
放置のできないバカはプログラム以前のことを勉強しなおせ
0196デフォルトの名無しさん2008/05/03(土) 03:41:22
IDの出ない板はNGにしにくくて困る
いっそコテハンつけてその話題をやって欲しいんだが
0197デフォルトの名無しさん2008/05/03(土) 03:47:00
とりあえずEOFをNGワードにすればおk
来月ぐらいまで我慢すれば飽きるでしょ
0198デフォルトの名無しさん2008/05/03(土) 03:54:18
ちょ、宿題スレで解答書くときEOF使うから困るw
0199デフォルトの名無しさん2008/05/03(土) 03:55:41
どうしても駄目なときはうpろだ使え
むしろsizeofを間違ってNGしないように気をつけろ
0200デフォルトの名無しさん2008/05/03(土) 04:57:32
EOFで騒いでいるキチガイ様はこちらの一等席(最高に頭の悪い発言をしてくださいスレ)へどうぞ
http://pc11.2ch.net/test/read.cgi/tech/1179394713/l50
0201デフォルトの名無しさん2008/05/03(土) 08:33:17
--- EOF
0202デフォルトの名無しさん2008/05/03(土) 10:55:48
ポインタ文字列、char* p = "ABCDE";
って場合は
p[0] = 'F';
って変えれないんだよね?
char num[80] = "ABCDE";
char* p = num;
ってポインタが文字列のはいった「配列」をさしてないと
ポインタに添え字つけて一文字代入するのは無理?
0203デフォルトの名無しさん2008/05/03(土) 11:01:29
うん。規格の範囲内では無理ってことになってる。
02042022008/05/03(土) 11:04:39
>>203
ありがとう
サンプルソースがなぜかポインタ文字列を直接操作してて
エラーでまくるから、自分の環境が悪いと思い込んでた
サンプルが間違ってたって事だね
0205デフォルトの名無しさん2008/05/03(土) 12:21:00
正確には未定義じゃなかったっけ

運が良ければ動くけどやるべきじゃないね
0206デフォルトの名無しさん2008/05/03(土) 14:08:20
ポインタといえばちょっと前の zdnet builder の記事も酷かったな。
202のサンプルと同じ間違いもしっかり犯してたし。
0207デフォルトの名無しさん2008/05/03(土) 16:24:32
>>206
過去形にするなや。未だに「レビュー中」のままだぞ。
0208デフォルトの名無しさん2008/05/03(土) 16:43:08
>>207 なんでこいつ偉そうなの?w
0209デフォルトの名無しさん2008/05/03(土) 16:48:07
自分の意に沿わない発言は全て「偉そう」ですか。大儀ですな。
0210デフォルトの名無しさん2008/05/03(土) 17:01:49
大儀である。下がってよいぞ
0211デフォルトの名無しさん2008/05/03(土) 17:04:02
大昔、リテラル文字列をいじっていい時代があったんだよ・・・。
リテラル文字列を char* に代入できるのはそれとの互換性のため。
今はもちろんいじっちゃいけないが。

いじっちゃいけないようにすることで、
同じリテラル文字列が登場したらそれを共通化できるようになるし、
もっと言えば "ABC" と "BC" みたいなのも共通化できるようになる。
0212デフォルトの名無しさん2008/05/03(土) 17:12:22
いやリテラル文字列は const char* constだから
普通にchar*に代入して参照できるわけだが。
0213デフォルトの名無しさん2008/05/03(土) 17:19:39
>>212
おかしなこと言わない。
リテラル文字列は const char の配列であってポインタじゃないし
(sizeof でサイズを取得できるから)、
char* に代入できるのは 「文字列リテラルは char* に代入できる」 という仕様が
特別に用意されているから。
0214デフォルトの名無しさん2008/05/03(土) 17:20:47
const char* constってchar*に代入できたっけ?
0215デフォルトの名無しさん2008/05/03(土) 17:21:06
>>213
おしい、後一歩だ、がんばれ
0216デフォルトの名無しさん2008/05/03(土) 17:23:10
char* に暗黙にキャストできる、と言った方が良かったか。
0217デフォルトの名無しさん2008/05/03(土) 17:32:05
>>207
過去形じゃないよ。現在完了形だよ。
0218デフォルトの名無しさん2008/05/03(土) 17:43:46
>>216
ここのところずっとC++しか触ってないからできないもんだと思ってた
Cだと警告しか出ないのね
0219デフォルトの名無しさん2008/05/03(土) 17:46:24
なんか大卒の奴にいい負けしてかなり悔しいのぅ悔しいのぅな
時代遅れのオッサンが、GW中にどこにも出かけられないから
ここで楽しんでいたところ、気分を悪くしてしまったようでw
0220デフォルトの名無しさん2008/05/03(土) 17:53:58
>>218
チガウチガウ
リテラル文字列を char* に暗黙にキャストできるという話。
これは C も C++ も同じ。
0221デフォルトの名無しさん2008/05/03(土) 17:55:57
EOFの次はchar*にリテラル文字列ですか。とことん暇な人が多いですね。
0222デフォルトの名無しさん2008/05/03(土) 17:57:54
EOF って何の話?
0223デフォルトの名無しさん2008/05/03(土) 17:59:09
Eroi Oneesan Fujikochan
0224デフォルトの名無しさん2008/05/03(土) 18:01:17
 EOF<ガオー
  人
0225デフォルトの名無しさん2008/05/03(土) 18:01:49
>>220
「リテラル文字列は const char* const」
「const char* constは普通にchar*に代入して参照できる」
だからリテラル文字列は普通にchar*に代入できるって意味の発言だと思ったんだが
私が単に読み間違えただけか。
0226デフォルトの名無しさん2008/05/03(土) 18:08:48
普通はconst外ししようと思ったらキャストがいるけど、const char* const→char*だけは歴史的な理由によりそれが要らないってことだろ。
0227デフォルトの名無しさん2008/05/03(土) 18:12:37
>>225
>「const char* constは普通にchar*に代入して参照できる」
こんなこと212しか言ってないような、
そして>>220=216=214と>>212は別人のような気がする。
0228デフォルトの名無しさん2008/05/03(土) 18:15:30
>>214と>>218と>>225が私で、
>>212と>>216と>>220が同一人物だと思ってたんだけど
それがすでに勘違いだったのか orz こりゃまた失礼しました
0229デフォルトの名無しさん2008/05/03(土) 18:38:13
ttp://www.sgnet.co.jp/c/2-1.htm
ここのサイトで

#include <stdio.h>
void main()
{
printf( "好きなことを書きましょう" );
}

ってなっているので、実際にやってみると
testa.c:1: error: missing terminating " character
testa.c: In function `main':
testa.c:3: warning: return type of 'main' is not `int'
というふうにエラーがでます。

で、大学では

#include <stdio.h>
int main(void)

って習ったのですが、どう違うんですか?こっちではうまくいったのですが。
0230デフォルトの名無しさん2008/05/03(土) 18:40:19
Cの初心者なんですが、コマンドプロンプトに関して
質問があります。
こちらで聞いてよろしいんでしょうか??
0231デフォルトの名無しさん2008/05/03(土) 18:41:49
>>229
そのコンパイラが日本語に対応してないんじゃね?
02322292008/05/03(土) 18:44:18
>>231
あ、すいません。

#include <stdio.h>
int main(void)
{
printf("好きなことを書きましょう");
}

で、うまく実行できたという意味です。
0233デフォルトの名無しさん2008/05/03(土) 18:44:52
素早い返答感謝です。
実行すると、内部ファイル云々、操作可能なプログラムと
認識されていません、と出ました。
内定先から頂いたDISCの指示に従ってインストールしたんですが・・・・
0234デフォルトの名無しさん2008/05/03(土) 18:46:24
何の話か知らないが内定先に聞けよ
0235デフォルトの名無しさん2008/05/03(土) 18:46:26
>>232
ttp://www.kijineko.co.jp/tech/superstitions/void-main.html
02362292008/05/03(土) 18:50:11
>>235
難しすぎてわからないのですが…

ようは、void main() と int main(void) は同じような意味だから
できたほうを使えってことですか?
0237デフォルトの名無しさん2008/05/03(土) 18:53:32
C++とCで仕様がちがうのでは?
0238デフォルトの名無しさん2008/05/03(土) 18:55:36
>>236
戻りはint。引数は依存って書いてあるな。void main(void)は不可か
0239デフォルトの名無しさん2008/05/03(土) 18:58:44
>>236
全部
int main
でおk
0240デフォルトの名無しさん2008/05/03(土) 19:01:50
>>229

そのサイトが嘘つき、もしくは正しい知識をもってない。
大学のほうが正解。
0241デフォルトの名無しさん2008/05/03(土) 19:05:22
あとint mainでやるなら
正常終了したって事を示す「return 0;」を忘れずに
0242デフォルトの名無しさん2008/05/03(土) 19:08:20
C99 なら大丈夫だけどね。
まだ C89 の環境多いから return 0; 書いた方がいいけど。
0243デフォルトの名無しさん2008/05/03(土) 19:13:18
>>232 みたいなちょっと「動作確認しました」くらいのやつならC89でもreturn 省略してもいいよ。
逆に、いちいちつっこむヤツを見ると、省略できるの知らないの? って思う。
0244デフォルトの名無しさん2008/05/03(土) 19:15:48
質問します。
Linuxのコンソールで擬似和音のビープ音鳴らすのにエスケープシーケンスを
使おうとおもってるんですが、printf関数でエスケープシーケンスを
出力すると、一旦出力バッファに貯められてしまうため、時間差で
音を出したくても上手く音が出力されません。

出力バッファを介さずに文字列を出力する関数ってなにかありますでしょうか?
0245デフォルトの名無しさん2008/05/03(土) 19:31:43
>>243
return を省略した際の動作は規格上は未定義。
C99 や C++ だと main 関数は特例として省略が可能だが、
C89 では main 関数にもそれが適用される。
大体の処理系は警告出すだけだがね。
02462302008/05/03(土) 20:03:24
妙な事をきいてしまってすみません。内定先もGW中で
担当の方がいらっしゃらない物で。
失礼しました。
0247デフォルトの名無しさん2008/05/03(土) 20:10:18
>>245
動作が未定義ってかリターン値が未定義だろ。
省略しても問題ないよ。
お作法的には書くほうがいいけど、書き捨てのコードにいちいちツッコミ入れるほどじゃないよ。
0248デフォルトの名無しさん2008/05/03(土) 20:17:00
>>244
Drawin / *bsd 系なので Linux はどうかしらないが fflush 使うか raw モードにするというのももある

// うまく管理して
{
 int fd;
 struct sgttyb bk, fm;
}


{
 if((fd = open("/dev/tty", O_RDWR)) == -1)
  return -1;

 ioctl(fd, TIOCGETP, &bk);

 fm = bk;
 if(fm.sg_flags != RAW)
 {
  fm.sg_flags = RAW;
  ioctl(fd, TIOCSETP, &fm);
 }

read(fd write(fd でどちらもバッファリング無しで入出力...
0249デフォルトの名無しさん2008/05/03(土) 20:22:02
>>236

int main() { .... ; return 0; } ですればどうでしょうね。
return 無しの例外が許されてるといいながら return 0; 記述がそれほど手間でもないのでは?

void main() の登場はいわゆる void 型が導入された次期からしばらくの間ではなかったか。サンプルが古いのであって目くじら立てずに見過ごせばどうかな?。
0250デフォルトの名無しさん2008/05/03(土) 20:25:31
めくじらっつーか、gcc じゃコンパイル通らんし。
0251デフォルトの名無しさん2008/05/03(土) 20:37:49
>>250
だから int main に読み替えればいいでしょって事なの。参考にしてる物に目くじら立てて(その例文は可笑しい)って作者に文句のメールでも送る?。そんな方向に行くのはどうかという事。
0252デフォルトの名無しさん2008/05/03(土) 20:38:49
>>251
仮にも 「講座」 を名乗るのにそれじゃマズいだろ。
■ このスレッドは過去ログ倉庫に格納されています