トップページ⇒tech
987コメント239KB

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

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

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

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART3
http://pc.2ch.net/test/read.cgi/tech/1016722820/

・前スレ
<21> http://pc.2ch.net/test/read.cgi/tech/1022045622/

他のリンクは>>2-10を見な。
0153デフォルトの名無しさんNGNG
VC++のって行番号出ないようなきがするんだけど設定すれば出るの?
0154デフォルトの名無しさんNGNG
>>153
#line で探す
0155デフォルトの名無しさんNGNG
うはは、そりゃわかりやすい方法だな(藁
0156デフォルトの名無しさんNGNG
>>153
んなもんすべての行に出てる必要ない。
カーソル位置の行番号は出てるし。
0157デフォルトの名無しさんNGNG
>>156
目が覚めた
0158デフォルトの名無しさんNGNG
>>150
MS-DOSのedit
0159デフォルトの名無しさんNGNG
>>152
こういうこと言う奴必ずいるよな。
というわけでviを薦める。
0160デフォルトの名無しさんNGNG
>>159
モジラが重いので却下
0161デフォルトの名無しさんNGNG
>>150
コンパイルは難しいかもしれんが、フォトショ
0162デフォルトの名無しさんNGNG
#include <stdio.h>
int main();
int main()
{
int c;
while((c=getchar()) !='.'){
printf("%c",c);
}
return (0);
}

かなりの初心者です。
はじめにcは整数型と宣言してるのに
なぜwhile文ではchar型で表示してるんですか?
型というものがわからなくなってきた。。。
0163デフォルトの名無しさんNGNG
>>162
char,intともに整数型だから互換性がある。
intで受けるのはgetcharがEOFも返すから。
0164デフォルトの名無しさんNGNG
>>163
初心者のおいらにはついていけないことが書いてある。。。
おいらの勉強している本には
intは整数型、charは文字型って書いてあるよ?
charは整数型なの?

>intで受けるのはgetcharがEOFも返すから

これはさっぱりわからない。。。
0165デフォルトの名無しさんNGNG
>>164
整数型
0166デフォルトの名無しさんNGNG
>>165
charは整数型って大抵のほんに書いてある??
「C言語プログラミングレッスン入門偏」(結城浩)って本にはかいてないよ。

「C言語プログラミングレッスン入門偏」(結城浩)この本いい本ですか?
0167デフォルトの名無しさんNGNG
>>164
charは1バイトの整数型。

> >intで受けるのはgetcharがEOFも返すから
> これはさっぱりわからない。。。

char型がコンパイラによっては符号なしだから(処理系依存)、負の数のEOFを受けるとまずい。
というわけでint型で受ける。
0168デフォルトの名無しさんNGNG
>>164

C言語ではchar型は整数型の一種でint以下のサイズ。

char -> int への拡大は暗黙で変換してくれる。

また関数の引数で型がプロトタイプ宣言に含まれてない場合、charの値はintに勝手に格上げされる。
printfの第二引数以降は可変引数のため型が明示されていないためあてはまる。

getchar()はcharで表せるすべての値に加えてEOFという値も返すため、charより大きいint型になっている。
0169167NGNG
>>168
> getchar()はcharで表せるすべての値に加えてEOFという値も返すため、charより大きいint型になっている。

あぁ、負の数がどうとかじゃなくてそういう理由か。
0170デフォルトの名無しさんNGNG
>>167
恥かしい質問ですけどintは何バイトの整数型なんですか?
0171デフォルトの名無しさんNGNG
>>170
それは処理系(とりあえずコンパイラだと考えてよい)によって違う。
必ずcharよりも大きくなければならない(といっても1バイトのcharよりも小さいなんてことはないけどね)。
0172171NGNG
例えば、私の環境だと、

int・・・4バイト
short int・・・2バイト
long int・・・4バイト
0173デフォルトの名無しさんNGNG
sizeof(int)バイトの整数型
0174デフォルトの名無しさんNGNG
>>173
ワラタ
0175デフォルトの名無しさんNGNG
>>170
規格では決まってない。
char <= short <= int <= long
という関係が言えるだけ。
現実はコンパイラごとに好きなように定義されていて、下手するとコンパイラオプションによっても
変わるコンパイラもある。
マニュアル嫁。
0176171NGNG
s/charよりも大きくなけれ/char以上で/
0177デフォルトの名無しさんNGNG
#include <stdio.h>
int main(void);
int main(void)
{
char x,y;
x=-10;
y=1;
printf("%d",x+y);
return (0);
}
これコンパイルして実行できました。
不思議だ。。。
0178デフォルトの名無しさんNGNG
>>177
不思議じゃない。
どう表示されるかはコンパイラ次第だけど。
0179デフォルトの名無しさんNGNG
177はcharが数字だとわかってない厨房
0180デフォルトの名無しさんNGNG
でも
#include <stdio.h>
int main(void);
int main(void)
{
char x,y;
x=-256;
y=1;
printf("%d",x+y);
return (0);
}
だと実行結果は1でした。
0181デフォルトの名無しさんNGNG
>>179
そうだと本人も言っているだろ。
ところで、数字って(プ
0182デフォルトの名無しさんNGNG
>>180
1byte==8bitと仮定して・・・・
charに-256は入らないよ。溢れた分は切り捨てられるはず。
0183デフォルトの名無しさんNGNG
>>182
8bitなら
128から-128までしか値を持たないってことですか?
0184デフォルトの名無しさんNGNG
>>183
127〜-128(2の補数の場合)か-127(1の補数の場合)
0185184NGNG
符号ありの場合ね。
0186デフォルトの名無しさんNGNG
>181
なんだこのやろう。このボケが。なにが プ だ。てめーは俺より上にいるつもりか。へっだせーやつだ。
0187デフォルトの名無しさんNGNG
#include <stdio.h>
int main(void);
int main(void)
{
char x;
x='5';
printf("%d",x);
return (0);
}
だったら53っていう整数が帰ってきた。
char型は整数型で整数は整数のまま扱い文字列は整数に変換して扱うってこと?
表示する場合%dと整数で表示することもできるし%cと文字として表示することもできる
んですよね?
0188デフォルトの名無しさんNGNG
>>184
あー、補数って習ったけど忘れた。。。復習しとこう。
0189デフォルトの名無しさんNGNG
>>187
5という文字のコードが53だったというだけ。
0190189NGNG
>>187
int x;
x=53;
printf("%c",x);

とやってみな。多分5と表示されると思うから。
0191デフォルトの名無しさんNGNG
>>186
ごめん。俺が悪かった。>>181の発言は撤回する。
0192デフォルトの名無しさんNGNG
>>189
文字コードってあるんだ。。。知らなかった。
#include <stdio.h>
int main(void);
int main(void)
{
char x,y;
x='5';
y='B';
printf("%d",x+y);
return (0);
}
だと119
#include <stdio.h>
int main(void);
int main(void)
{
char x,y;
x='5';
y='B';
printf("%c",x+y);
return (0);
}
だとw。
wの文字コードは119ってことですね。
文字コード票みたいなのってあるの?
0193デフォルトの名無しさんNGNG
>>192
それを自分でつくってみよう。
と言いたいところだけど、表示できない文字もあるから・・・・

ASCIIならhttp://www.e-words.ne.jp/page.asp?p=r-ascii
0194デフォルトの名無しさんNGNG
>>193
サンクス!
EOFはのってないね。
-128?とにかく負の数なんですね。
0195デフォルトの名無しさんNGNG
>>194
stdio.hの中をみるか、printf("%d\n",EOF);で表示してみる。
0196デフォルトの名無しさんNGNG
>>194
\x1aじゃなかった?
0197デフォルトの名無しさんNGNG
>>195
-1でした。
0198デフォルトの名無しさんNGNG
今日はどうも有難うございました。
charとintの関係がわかりました。
0199デフォルトの名無しさんNGNG
>>194-197
微妙なすれ(×スレ)違いにワラタ
0200デフォルトの名無しさんNGNG
関数で 使うスタックの 大きさを 簡易 的に 見る ため の
いいGNU ツールが あったら 教え や が れ。
0201デフォルトの名無しさんNGNG
c++の事で悪いけど、++スレなかったんで教えて。
シフトって++だとなくなったの?
0202デフォルトの名無しさんNGNG
おまえの目は節穴か
0203デフォルトの名無しさんNGNG
>>201
http://pc.2ch.net/test/read.cgi/tech/1021787032/l50

シフト演算子のことなら、削るわけないだろ
0204デフォルトの名無しさんNGNG
リンカスクリプトの書き方を判りやすく解説したページはどこにあるんですか?
0205デフォルトの名無しさんNGNG
>>203
多分

cout << "hello" << endl;

見て愕然となったと思われ。
違う演算子採用しろよと言いたい。
0206デフォルトの名無しさんNGNG
僕は、17歳高校2年生。
3ヶ月前まではこんなことを言って皆さんをハァハァさせてしまいました。
http://pc.2ch.net/test/read.cgi/tech/1014370940/
だけど、それから優しいお兄さんたちにいろいろと教えてもらいながら、
勉強することで、C言語を大体マスターすることができました。

今ゲームを開発しているのですが、兄さんは僕自身を開発するとか
言って、なかなかプログラミングに集中させてくれません。
質問するたびに僕の体を触ってくるので正直困っちゃってます。
ぼく自身、そういうのは好きだけど、それだけじゃゲーム作りが進まないので、
ここに質問させてください。よろしくお願いします。
FAQ的な質問ならぼくも回答します。間違いがあれば、先輩方の訂正を
お待ちしております。

なお、課題の○投げは一応別スレへ、ということでお願いします。

プライベートな質問に関してはスレの950が過ぎたあたりから受け付けますので
それまでそういったことは、なるべく謹んでください。





0207デフォルトの名無しさんNGNG
もういちど質問させていただきたく思います。
getchar()っていうのは入力された文字の1番初めの文字を
代入する関数で"abc"って入力されたら
x=getchar()のxには"a"が入りますよね。

int c;
while((c=getchar()) !='.'){
printf("%c",c);
}

これで"abc"と入力したらcには"a"が入ってるからずっとaが表示される
と考えてしまったのですが、違いますよね。どこが違うのでしょう。
0208デフォルトの名無しさんNGNG
>>207
実行してみたらわかるやん。
0209デフォルトの名無しさんNGNG
>>207
"a" ではなく 'a' ね。Cではこの違いは大きい。

で、getchar()は一回呼ぶごとに次の文字を取り出すよ。
whileの条件部は毎回実行される。
0210デフォルトの名無しさんNGNG
>"abc"って入力されたらx=getchar()のxには"a"が入りますよね。
'a'って入力された時点getcharは'a'を返しておしまい。
0211デフォルトの名無しさんNGNG
2chをQ&A代わりに使うなよ・・・
0212デフォルトの名無しさんNGNG
""は文字列で''は文字でしたね。

>getchar()は一回呼ぶごとに次の文字を取り出すよ。
>whileの条件部は毎回実行される。

初めて知りました。

c=getchar()
で'abc'
って入れたら'a'をかえして
もう一回
c=getchar()
とかくと
'b'を返すんですね。
0213デフォルトの名無しさんNGNG
c=getchar()
で'a'と入れたら'a'をかえして
もう一回
c=getchar()
と書いて
'b'と入れたら'b'を返すんですよ。
0214デフォルトの名無しさんNGNG
だからgetchar()は1文字書かれた時点でそれを返して終わりなんだと。
分からんのかね。
0215デフォルトの名無しさんNGNG
>>212
> 初めて知りました。

嘘つくな。
んじゃなきゃwhileは全て0回実行か無限ループか?
0216デフォルトの名無しさんNGNG
>>213

c=getchar()
で'ab'と入れたら'a'をかえすんですよね?
0217デフォルトの名無しさんNGNG
>>216
そうです。
0218デフォルトの名無しさんNGNG
>>216
'ab' ではなく "ab" ね。Cではこの違いは大きい。
0219デフォルトの名無しさんNGNG
whileの意味さえ分かってないみたいだから、
while使わないでgetchar何回並べて呼んで試してみろよ。
0220デフォルトの名無しさんNGNG
int c;
while((c=getchar()) !='.'){
printf("%c",c);
}
で'abc'って入力する時
キーボードでaを叩いた瞬間には'a'は表示されませんけど
表示しようとしてるんですか?うーん、説明がへんか。。。
0221デフォルトの名無しさんNGNG
バッファリングされているからです。
0222デフォルトの名無しさんNGNG
>>215
>getchar()は一回呼ぶごとに次の文字を取り出すよ。
を初めて知ったってことです。。。
0223デフォルトの名無しさんNGNG
そりゃ毎回同じ文字返したら役に立たんでしょ・・・
0224デフォルトの名無しさんNGNG
っていうか、こういう明らかに入門書も読んでない
レベルの質問にまじめに答えないで欲しい。
0225デフォルトの名無しさんNGNG
>>224
円形脱毛同意
0226デフォルトの名無しさんNGNG
確かに。
0227デフォルトの名無しさんNGNG
「C言語プログラミングレッスン入門偏」(結城浩)
って本を読んでるんですけど
getchar()は1文字を標準入力をから得るとしか書かれてないんですが。
この本は説明不足ですか?
0228デフォルトの名無しさんNGNG
「C言語プログラミングレッスン入門偏」(結城浩)
って本を読んでるんですけど
getchar()は1文字を標準入力から得るとしか書かれてないんですが。
この本は説明不足ですか?

の間違い。

0229デフォルトの名無しさんNGNG
>>228の脳が不足してます。
0230デフォルトの名無しさんNGNG
Q&Aはどこで聞いた方がいいですか?
2ちゃんで聞かずにどこかの掲示板で聞いた方が良い?
0231デフォルトの名無しさんNGNG
MSDNLから抜粋>
ファイルの現在位置から 1 文字読み出し、関連するファイル ポインタが定義されている場合は次の文字を指すためにポインタを増やします。

これくらい書いてなきゃ説明不足
0232デフォルトの名無しさんNGNG
>>229
その文章で

getchar()は一回呼ぶごとに次の文字を取り出すことを
読み取れますか?
0233デフォルトの名無しさんNGNG
>>232
分かんなかったらgoogleで調べることくらいしない時点で応用力0です。
0234デフォルトの名無しさんNGNG
>>231
それはgetcharの説明か?
0235デフォルトの名無しさんNGNG
>>228
その本を捨てましょう
説明不足かどうかはともかく、読んでも理解できてないってことはあなたにはあってないってことでしょ
あなたにあった、理解できる本を探しましょう
0236デフォルトの名無しさんNGNG
>>233
分かりました。2ちゃんでひとに聞く前に自分で調べる癖をつけるようにします。
それでも分からなかったらここに機器にきてもいいでしょうか?
0237デフォルトの名無しさんNGNG
>>234
getcharだよ
といってもgetcと共有なので、ああいう書き方になってるもよう
0238デフォルトの名無しさんNGNG
>>235さんは
getchar()は1文字を標準入力から得るという説明を読んで
getchar()は一回呼ぶごとに次の文字を取り出すことを
読み取れますか?

0239デフォルトの名無しさんNGNG
>>238
scanfやgetsをやってれば読み取れる
でも予備知識無しにその1文だけをぱっと見せられたら読み取れないだろうね
(普通はサンプルを見て理解できるもんだと思うけど)
だからそんな糞本捨てちゃえ、と
0240デフォルトの名無しさんNGNG
質問なんですが、任意の2数の割り算のプログラムを
シフト演算子をつかって書けと言う問題で

#include<stdio.h>
main()
{
unsigned long n,m,b,sho,wrk,i;
printf("n,m?\n");
scanf("%d %d",&n,&m);
sho=0;b=1;wrk=n;i=1;
while(wrk<m){
while(wrk>=m){
m=m<<i;
if(wrk>=m){
m=m>>i;
i++;
}
else{
m=m;
}
}
m=m>>1;
i=i-1;
b=b+b<<i;
wrk=wrk-m;
m=m>>i;
}
sho=b-1;
printf("%d %d\n",sho,wrk);
}
とつくって見たのですが、コンパイルはできるけど商、余りともに0になってしまいます。
自分でつくってみて、トレースしてみてもどこがおかしいのかわかりません。
0、0でコンパイルできるって言う事はwhileの条件がおかしいのかなとも考えたのですがどうも…。
どなたか教えていただけませんでしょうか?
もし、スレ違いでしたら、誘導をお願いいただけませんでしょうか。
PC板は初めてなもので。
よろしくおねがいします。
0241デフォルトの名無しさんNGNG
宿題?
0242デフォルトの名無しさんNGNG
getsは標準入力から文字列を取得する関数と書いてありました。
これも説明間違ってます?
0243デフォルトの名無しさんNGNG
> while(wrk<m){
> while(wrk>=m){

1回も実行されない
0244243NGNG
というのは俺の勘違い
0245デフォルトの名無しさんNGNG
テスト
0246デフォルトの名無しさんNGNG
>>242
なぜ検索しない?
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getchar.3.html
0247デフォルトの名無しさんNGNG
>>242
getsは複数回実行したら同じ文字列を返しますか?
printfは複数回実行したら前に出力した場所を上書きしますか?
その流れでgetcを理解する人間ならその本でもいいでしょう
理解しない人間は別の、もっと正確に解説した本を読みましょう
0248デフォルトの名無しさんNGNG
>>242
漏れも捨てていいと思う、その本
0249名無しさんNGNG
C言語ってマスターするのに最低どれくらいかかりますか?
0250デフォルトの名無しさんNGNG
>>249
果て無き道のり、とかっこつけてみる
0251デフォルトの名無しさんNGNG
>>242
本当にそれしか書いてないの?
その本の他の部分でサンプル付きとかで
もっと詳しく解説されてたりするんじゃ?
0252デフォルトの名無しさんNGNG
>>251
はい。
お勧めの本はありますか?
■ このスレッドは過去ログ倉庫に格納されています