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:130154デフォルトの名無しさん
2008/05/02(金) 02:25:20EOFの入力は余裕で可能です、ありがとうございますた。
0155デフォルトの名無しさん
2008/05/02(金) 02:36:350156デフォルトの名無しさん
2008/05/02(金) 02:47:550157デフォルトの名無しさん
2008/05/02(金) 03:01:33キチガイに付き合うやつもキチガイ
0158デフォルトの名無しさん
2008/05/02(金) 03:38:01当然EOFコードを検出するのに、ファイルの終わりを示している
コードを使うのもありです、本当に本当に、重ね重ね、ありがとうございますた!
0159デフォルトの名無しさん
2008/05/02(金) 09:40:33■死にたくなければ、このレスをコピーして他のスレに □
□10回貼り付けて下さい。1時間以内にです!もし無 ■
■した場合は、今日寝ている間に富子さんがやってきて□
□貴方の首を絞めに来ます。富子さんは太平洋戦争の■
■時に16歳という若さで亡くなった女の子で、未だに成 □
□仏していないそうです。信じる信じないは貴方次第。 ■
■今年になってからこのレスを無視した人で、“呪われ □
□て死亡した人”が続出しています。これは富子さんの ■
■呪い。呪われて死んでもいいのならこれを無視するこ□
□とでしょうね。 ■
■――貴方がこうしているうちに富子さんが後ろから見□
□ていますよ…。 ■
■□■□■□■□■□■□■□■□■□■□■□■□
0160デフォルトの名無しさん
2008/05/02(金) 11:08:020161その1は宿題スレね
2008/05/02(金) 11:30:280162デフォルトの名無しさん
2008/05/02(金) 21:51:560163デフォルトの名無しさん
2008/05/02(金) 21:53:070164デフォルトの名無しさん
2008/05/02(金) 21:53:47何か切れてる? Unixなら伝統的に ^D = EOF
そそ、だからといって通常に ^D (0x04) が現れても EOF にはならないよ。
とにかくファイルに EOF というコードが有ると勘違いしるのかとおもった。
>>160 おっと、すまん。そのとおりだ。
0165デフォルトの名無しさん
2008/05/02(金) 22:07:28どのOSならとかどーでも良いんじゃい(竹原風に)
キーボードからの入力は可能だし、EOFはマクロで値が定義されているし
なんならそれに応じた入力をしてやりゃ良いんだよ。所詮俺らが視覚的に
見えているものは、デジタルデータ、0と1の組み合わせの符号、信号。
0166デフォルトの名無しさん
2008/05/02(金) 22:52:18char num[sum];
みたいな
0167デフォルトの名無しさん
2008/05/02(金) 22:52:54C99じゃあるまいし
0168デフォルトの名無しさん
2008/05/02(金) 22:54:49すまない。俺はまだレベル6だ
0169デフォルトの名無しさん
2008/05/02(金) 23:02:160170デフォルトの名無しさん
2008/05/02(金) 23:06:20ttp://seclan.dll.jp/c99d/c99d04.htm#dt19990719
0171デフォルトの名無しさん
2008/05/02(金) 23:14:11そのページのsizeofのところでふいたw
図からわかるようにって、代入しただけで何がわかるんだよ
0172デフォルトの名無しさん
2008/05/02(金) 23:16:40図の中のコメントに代入されるはずの値が書いてあるから
それを見ろということだろ。
0173デフォルトの名無しさん
2008/05/02(金) 23:23:54結論からいうと変数は使えない・・・ので malloc alloc がある。
char* num = (char*)malloc(num*sizeof(char));
...
*(num+5) = 5; // or num[5] = 0; // みたいな...
...
free(num);
0174デフォルトの名無しさん
2008/05/02(金) 23:26:190175デフォルトの名無しさん
2008/05/02(金) 23:32:18どうも何かごかいしているね。
EOF = (-1) が定義されているとしてこの -1 は入力できない値(int)なのよ。getchar() などが EOF と判断した条件の時に文字として存在しない値 (int)-1 0xffff あるいは 0xffffffff が返されるものなのだから。。。判るかな?
0176デフォルトの名無しさん
2008/05/02(金) 23:37:27君ね、いい加減鬱陶しい。マクロを知らないのか?所詮、プログラム言語も仕様も
人間が都合よく定義、規格化しているだけ。EOFがどうとかどうでも良いんじゃい。
所詮 数値データ だと何度も言っているだろ。あとはマクロを使うことで
より幅広い環境で通用するという話。いい加減、大学にも通ってないような
低レベルとは話はしたくないんで。
0177デフォルトの名無しさん
2008/05/02(金) 23:38:13使えた。
0178デフォルトの名無しさん
2008/05/02(金) 23:39:06> この -1 は入力できない値(int)なのよ
これだけ取り出しても、こいつが相当な勘違い野郎だということがはっきりしたな。
入力の意味も広義で説明されていたというのに。ねぇ、こういう知ったかが
どこか政府が運営する機関の関係者にいたらどう思う?マジでやべーよ。
まぁ、こんな似非理系は当然、専門学校程度だろうけど。
0179デフォルトの名無しさん
2008/05/02(金) 23:46:30EOFの入力は余裕で可能です、ありがとうございますた。
0180デフォルトの名無しさん
2008/05/02(金) 23:47:14コメントの数字が正しいことはどうやって証明するんだよw
0181デフォルトの名無しさん
2008/05/02(金) 23:48:12…
0182デフォルトの名無しさん
2008/05/02(金) 23:50:47入力受付のライブラリを用いて話をするが、while(getchar()!=EOF); で
ループを止める際に、どうやって止めたいんだい、プログラムは?w
論点はそこじゃない。EOFが入力可能か?答えはYES。適切に処理しない
環境をいちいち持ち出されても迷惑。256色しか表現できない環境で
24ビット画像を正確に表示しようとしても無理なようにね。
くどいが、こんな目の前にある機械なんて、所詮人間がルール(規格)を決めて
定義されたとおりにコンピュータがデータを実装された能力に応じて
展開しているに過ぎない、人間が都合よく解釈できるように。
コンピュータには目の前の文字も画像も映像データも、0と1の塊にしか見えんよ。
あとは規則に則って処理しているだけ。
0184デフォルトの名無しさん
2008/05/02(金) 23:57:49そんなむきにならならなくても。
0185デフォルトの名無しさん
2008/05/02(金) 23:59:05> この -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:020187デフォルトの名無しさん
2008/05/03(土) 00:29:06fgetc(), getc(), getchar() の返り値は int ですから、EOF (-1) はファイル中に存在する値でも
なければ、stdin から入力できる値でもないと思うのですが。
0188デフォルトの名無しさん
2008/05/03(土) 00:30:53ああ、ようやく普通の人にであえたきが・・。勘違い >>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:33int 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暴れてるのは一人だけで、まともに相手にすると余計暴れるからスルーしてるだけ
0191デフォルトの名無しさん
2008/05/03(土) 01:01:03「C言語きやすく質問おk」と書かれた扉を開けたら
腕組んでイライラした奴らがこっちを見て来た状況と同じくらい
質問しづらいんだが。
0192デフォルトの名無しさん
2008/05/03(土) 01:22:020193デフォルトの名無しさん
2008/05/03(土) 01:33:53おっ、丁寧に。サンプル間違ってたけどそこはなんだ。うまく修正してくれたわけか。C99 あるいは今の GNU C/C++系だと気付かなかった世界かもしれん。再変更する realloc もあるで。
0194デフォルトの名無しさん
2008/05/03(土) 01:53:55あ!?んだよ!?
0195デフォルトの名無しさん
2008/05/03(土) 01:59:580196デフォルトの名無しさん
2008/05/03(土) 03:41:22いっそコテハンつけてその話題をやって欲しいんだが
0197デフォルトの名無しさん
2008/05/03(土) 03:47:00来月ぐらいまで我慢すれば飽きるでしょ
0198デフォルトの名無しさん
2008/05/03(土) 03:54:180199デフォルトの名無しさん
2008/05/03(土) 03:55:41むしろsizeofを間違ってNGしないように気をつけろ
0200デフォルトの名無しさん
2008/05/03(土) 04:57:32http://pc11.2ch.net/test/read.cgi/tech/1179394713/l50
0201デフォルトの名無しさん
2008/05/03(土) 08:33:170202デフォルトの名無しさん
2008/05/03(土) 10:55:48って場合は
p[0] = 'F';
って変えれないんだよね?
char num[80] = "ABCDE";
char* p = num;
ってポインタが文字列のはいった「配列」をさしてないと
ポインタに添え字つけて一文字代入するのは無理?
0203デフォルトの名無しさん
2008/05/03(土) 11:01:290204202
2008/05/03(土) 11:04:39ありがとう
サンプルソースがなぜかポインタ文字列を直接操作してて
エラーでまくるから、自分の環境が悪いと思い込んでた
サンプルが間違ってたって事だね
0205デフォルトの名無しさん
2008/05/03(土) 12:21:00運が良ければ動くけどやるべきじゃないね
0206デフォルトの名無しさん
2008/05/03(土) 14:08:20202のサンプルと同じ間違いもしっかり犯してたし。
0207デフォルトの名無しさん
2008/05/03(土) 16:24:32過去形にするなや。未だに「レビュー中」のままだぞ。
0208デフォルトの名無しさん
2008/05/03(土) 16:43:080209デフォルトの名無しさん
2008/05/03(土) 16:48:070210デフォルトの名無しさん
2008/05/03(土) 17:01:490211デフォルトの名無しさん
2008/05/03(土) 17:04:02リテラル文字列を char* に代入できるのはそれとの互換性のため。
今はもちろんいじっちゃいけないが。
いじっちゃいけないようにすることで、
同じリテラル文字列が登場したらそれを共通化できるようになるし、
もっと言えば "ABC" と "BC" みたいなのも共通化できるようになる。
0212デフォルトの名無しさん
2008/05/03(土) 17:12:22普通にchar*に代入して参照できるわけだが。
0213デフォルトの名無しさん
2008/05/03(土) 17:19:39おかしなこと言わない。
リテラル文字列は const char の配列であってポインタじゃないし
(sizeof でサイズを取得できるから)、
char* に代入できるのは 「文字列リテラルは char* に代入できる」 という仕様が
特別に用意されているから。
0214デフォルトの名無しさん
2008/05/03(土) 17:20:470215デフォルトの名無しさん
2008/05/03(土) 17:21:06おしい、後一歩だ、がんばれ
0216デフォルトの名無しさん
2008/05/03(土) 17:23:100217デフォルトの名無しさん
2008/05/03(土) 17:32:05過去形じゃないよ。現在完了形だよ。
0218デフォルトの名無しさん
2008/05/03(土) 17:43:46ここのところずっとC++しか触ってないからできないもんだと思ってた
Cだと警告しか出ないのね
0219デフォルトの名無しさん
2008/05/03(土) 17:46:24時代遅れのオッサンが、GW中にどこにも出かけられないから
ここで楽しんでいたところ、気分を悪くしてしまったようでw
0220デフォルトの名無しさん
2008/05/03(土) 17:53:58チガウチガウ
リテラル文字列を char* に暗黙にキャストできるという話。
これは C も C++ も同じ。
0221デフォルトの名無しさん
2008/05/03(土) 17:55:570222デフォルトの名無しさん
2008/05/03(土) 17:57:540223デフォルトの名無しさん
2008/05/03(土) 17:59:090224デフォルトの名無しさん
2008/05/03(土) 18:01:17人
0225デフォルトの名無しさん
2008/05/03(土) 18:01:49「リテラル文字列は const char* const」
「const char* constは普通にchar*に代入して参照できる」
だからリテラル文字列は普通にchar*に代入できるって意味の発言だと思ったんだが
私が単に読み間違えただけか。
0226デフォルトの名無しさん
2008/05/03(土) 18:08:480227デフォルトの名無しさん
2008/05/03(土) 18:12:37>「const char* constは普通にchar*に代入して参照できる」
こんなこと212しか言ってないような、
そして>>220=216=214と>>212は別人のような気がする。
0228デフォルトの名無しさん
2008/05/03(土) 18:15:30>>212と>>216と>>220が同一人物だと思ってたんだけど
それがすでに勘違いだったのか orz こりゃまた失礼しました
0229デフォルトの名無しさん
2008/05/03(土) 18:38:13ここのサイトで
#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質問があります。
こちらで聞いてよろしいんでしょうか??
0231デフォルトの名無しさん
2008/05/03(土) 18:41:49そのコンパイラが日本語に対応してないんじゃね?
0232229
2008/05/03(土) 18:44:18あ、すいません。
#include <stdio.h>
int main(void)
{
printf("好きなことを書きましょう");
}
で、うまく実行できたという意味です。
0233デフォルトの名無しさん
2008/05/03(土) 18:44:52実行すると、内部ファイル云々、操作可能なプログラムと
認識されていません、と出ました。
内定先から頂いたDISCの指示に従ってインストールしたんですが・・・・
0234デフォルトの名無しさん
2008/05/03(土) 18:46:240235デフォルトの名無しさん
2008/05/03(土) 18:46:26ttp://www.kijineko.co.jp/tech/superstitions/void-main.html
0236229
2008/05/03(土) 18:50:11難しすぎてわからないのですが…
ようは、void main() と int main(void) は同じような意味だから
できたほうを使えってことですか?
0237デフォルトの名無しさん
2008/05/03(土) 18:53:320238デフォルトの名無しさん
2008/05/03(土) 18:55:36戻りはint。引数は依存って書いてあるな。void main(void)は不可か
0239デフォルトの名無しさん
2008/05/03(土) 18:58:44全部
int main
でおk
0240デフォルトの名無しさん
2008/05/03(土) 19:01:50そのサイトが嘘つき、もしくは正しい知識をもってない。
大学のほうが正解。
0241デフォルトの名無しさん
2008/05/03(土) 19:05:22正常終了したって事を示す「return 0;」を忘れずに
0242デフォルトの名無しさん
2008/05/03(土) 19:08:20まだ C89 の環境多いから return 0; 書いた方がいいけど。
0243デフォルトの名無しさん
2008/05/03(土) 19:13:18逆に、いちいちつっこむヤツを見ると、省略できるの知らないの? って思う。
0244デフォルトの名無しさん
2008/05/03(土) 19:15:48Linuxのコンソールで擬似和音のビープ音鳴らすのにエスケープシーケンスを
使おうとおもってるんですが、printf関数でエスケープシーケンスを
出力すると、一旦出力バッファに貯められてしまうため、時間差で
音を出したくても上手く音が出力されません。
出力バッファを介さずに文字列を出力する関数ってなにかありますでしょうか?
0245デフォルトの名無しさん
2008/05/03(土) 19:31:43return を省略した際の動作は規格上は未定義。
C99 や C++ だと main 関数は特例として省略が可能だが、
C89 では main 関数にもそれが適用される。
大体の処理系は警告出すだけだがね。
0246230
2008/05/03(土) 20:03:24担当の方がいらっしゃらない物で。
失礼しました。
0247デフォルトの名無しさん
2008/05/03(土) 20:10:18動作が未定義ってかリターン値が未定義だろ。
省略しても問題ないよ。
お作法的には書くほうがいいけど、書き捨てのコードにいちいちツッコミ入れるほどじゃないよ。
0248デフォルトの名無しさん
2008/05/03(土) 20:17:00Drawin / *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:02int main() { .... ; return 0; } ですればどうでしょうね。
return 無しの例外が許されてるといいながら return 0; 記述がそれほど手間でもないのでは?
void main() の登場はいわゆる void 型が導入された次期からしばらくの間ではなかったか。サンプルが古いのであって目くじら立てずに見過ごせばどうかな?。
0250デフォルトの名無しさん
2008/05/03(土) 20:25:310251デフォルトの名無しさん
2008/05/03(土) 20:37:49だから int main に読み替えればいいでしょって事なの。参考にしてる物に目くじら立てて(その例文は可笑しい)って作者に文句のメールでも送る?。そんな方向に行くのはどうかという事。
0252デフォルトの名無しさん
2008/05/03(土) 20:38:49仮にも 「講座」 を名乗るのにそれじゃマズいだろ。
■ このスレッドは過去ログ倉庫に格納されています