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

C言語なら俺に聞け! Part 99

■ このスレッドは過去ログ倉庫に格納されています
0001v(^o^i)dNGNG
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 98
http://pc5.2ch.net/test/read.cgi/tech/1104114259/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0685デフォルトの名無しさん05/01/20 21:12:37
ポインタとポインタ変数を混同してる奴が多いな。
0686デフォルトの名無しさん05/01/20 21:13:41
>>628によると 評価する!=読み書きする と言っていて、
>>680によると 評価する==読み書きする って言ってるわけですよね。
結局どっちが正しいんですか?
0687デフォルトの名無しさん05/01/20 21:16:42
>686
マニュアル見て自分で判断
0688デフォルトの名無しさん05/01/20 21:20:49
>>684
りんご
0689デフォルトの名無しさん05/01/20 21:23:16
>>687
わからないんで教えてください
0690デフォルトの名無しさん05/01/20 21:25:43
void ってコンパイラの中では *(NULL *)で定義されてるんだっけ?
0691デフォルトの名無しさん05/01/20 21:26:20
違った

NULL ってコンパイラの中では *(void 0)で定義されてるんだっけ?
0692デフォルトの名無しさん05/01/20 21:27:17
NULL は stdio.h の中で、((void *)0) と定義されています

http://www1.cts.ne.jp/~clab/hsample/File/File01/File01.html
069362805/01/20 21:31:34
アドレスバスに出力とか言い出したのお前さんじゃないか。
そういうこと言い出した時点で実装の話になっちゃうんだっての。
0694デフォルトの名無しさん05/01/20 21:33:32
>>693
>>680
069562805/01/20 21:36:13
>>694
メール欄の意味がわからんので、教えてくれ。レスを無視すればいいのか?
0696デフォルトの名無しさん05/01/20 21:37:32
>686
文法の評価と式の評価の混同。最適化されると無視されるかも知れない。完全にコンパイラとプリプロセサの状態に依存する。
「遊んでないで仕事しろ!」
0697デフォルトの名無しさん05/01/20 21:39:34
>>695
>>695

>>696
シンタックスとセマンティクスを一緒にしてるのはオマエだ
0698デフォルトの名無しさん05/01/20 21:40:23
パーサ書いてるつもりでコードジェネレータ作るタイプな
0699デフォルトの名無しさん05/01/20 21:45:31
>>696
なんかよくわからないです。コンパイラとプリプロセッサってことは実装に依存するってことですか?
0700デフォルトの名無しさん05/01/20 21:49:08
>699
何が?
0701デフォルトの名無しさん05/01/20 21:50:51
おまえらキモヲタばかりだなwww
0702デフォルトの名無しさん05/01/20 21:53:45
>>700
よくわからないんでやっぱり取り消してください。わからないなりに考えると
>>607は、アクセスが起こるかどうかはやってみないとわからないけど、評価はされるってことですか?
0703デフォルトの名無しさん05/01/20 21:55:32
>702
何が評価?
0704デフォルトの名無しさん05/01/20 21:56:34
*p; って部分です
0705デフォルトの名無しさん05/01/20 22:00:19
>704
その部分の値か?それとも式か?
0706デフォルトの名無しさん05/01/20 22:03:43
式とされた結果、値が出てくるんじゃないですか?
ひょっとして勘違いしてますかね?
0707デフォルトの名無しさん05/01/20 22:07:21
>704
その式に副作用はあるのか
0708デフォルトの名無しさん05/01/20 22:10:19
ないと思います
0709デフォルトの名無しさん05/01/20 22:16:27
なんかわかってきたような気がします。 while(1); とか書けますよね。
ということは、1は式としてみなされてるってことですよね。
ということは、 1; ってのは、 a=1; とかと同じように式とされるってことですか?
0710デフォルトの名無しさん05/01/20 22:19:59

いまどきC言語なんかできても自慢になりません。
プログラマ?(ププ…って時代だしw
俺はSE。おまいらから見れば超上級職だろうなw

0711デフォルトの名無しさん05/01/20 22:42:56
>1; ってのは、 a=1; とかと同じように式とされるってことですか?

式ってとこはあってるが、動詞の有無は違う
0712デフォルトの名無しさん05/01/20 22:44:16
>>710
あなたは、その実態が「単価が高くて使いにくいプログラマ」だったりするSEなんですね?(Y/y)
0713デフォルトの名無しさん05/01/20 22:46:00
>>712
× 使いにくい
○ 機能しない
0714デフォルトの名無しさん05/01/20 22:47:48
>>710
お前が超上級職であるSEだという証拠を見せろ。
0715デフォルトの名無しさん05/01/20 22:48:36
while(1.0); とか書けますか
0716デフォルトの名無しさん05/01/20 22:50:44
ぬ る ぽ
0717デフォルトの名無しさん05/01/20 22:52:43
で、結局だれが正しいんだ
0718デフォルトの名無しさん05/01/20 22:53:01
typedef struct {
    void* p;
} NullPointerException;

C99でもこんな構造体ないの?
0719デフォルトの名無しさん05/01/20 22:58:15
>>718
ないガッ?
0720デフォルトの名無しさん05/01/20 22:59:16
>>715
while (1,0);  ならOK。
0721デフォルトの名無しさん05/01/20 23:03:03
>>710
雑用係はマ板へ。
0722デフォルトの名無しさん05/01/20 23:10:46
SEも同程度に負け組
0723デフォルトの名無しさん05/01/20 23:19:07
IT自体が負け(プギャヒャラ
0724デフォルトの名無しさん05/01/20 23:21:48
>>723
勝ち組のつもりでこの世界に入るアフォは痛杉
しょせんベンチャー
鉄くず泥棒どもは開き直ってなんぼだよ
0725デフォルトの名無しさん05/01/20 23:23:07
なんでみんな>>910に釣られてるの?低レベルだから?

>>607はまず実行結果をここに貼り付けてみろ
オマエの画面はどうなってる?
0726デフォルトの名無しさん05/01/20 23:25:42
所詮日本は文系の社会

実力のある奴はみんな米国だよ
0727デフォルトの名無しさん05/01/20 23:29:03
>>910の責任がいやが上にも高まった
0728デフォルトの名無しさん05/01/20 23:30:24
二桁最後のスレなんだからマターリしろ
0729デフォルトの名無しさん05/01/20 23:38:31
勝ちとか負けとか、んなことバッカいってるショウもない奴は
ママのおっぱいでもしゃぶってろ
0730デフォルトの名無しさん05/01/20 23:40:21
>>729
ママのおっぱいしゃぶりながら言わないでくれ
0731デフォルトの名無しさん05/01/20 23:41:43
うわ、キモッ・・・
0732デフォルトの名無しさん05/01/20 23:50:22
char cycleno[10]    = "1234567890";

if (strlen(cycleno) > sizeof(cycleno)) {        
        printf("strlen(cycleno) %d\n",strlen(cycleno));
        printf("sizeof(cycleno) %d\n",sizeof(cycleno));
        printf("cycleno %s\n",cycleno);
}

/********* 出力 *********/
strlen(cycleno) 16
sizeof(cycleno) 10
cycleno 1234567890慎


質問です。
上記の様に、strlen()で末尾にNULL文字の無い文字列を調べた時
訳分からん値が返ってくる件についてなんすが
これってNULL文字が検出されるまで
メモリ内の無関係な隣りの領域まで読み込んでるって解釈でよいのですか
また、%s出力に関しても同義ですか

あと、上記の解釈で正しいとすれば、仮にNULL文字がたまたまずっと
検出されなかったとすると、永久に読み込みが走るのですか





0733デフォルトの名無しさん05/01/20 23:51:41
>>732
その前にアクセス違反で落ちる
0734デフォルトの名無しさん05/01/20 23:54:23
>>733
会社のHP-UXと自宅のRedHatは落ちなかったとですよ
0735デフォルトの名無しさん05/01/20 23:55:18
> 俺はSE。おまいらから見れば超上級職だろうな

...
0736デフォルトの名無しさん05/01/20 23:57:37
> メモリ内の無関係な隣りの領域まで読み込んでるって解釈でよいのですか

そんなに疑問なら、
cycleno[0]
cycleno[1]
cycleno[2]
...
cycleno[9]
cycleno[10]
...
cycleno[14]
cycleno[15]
cycleno[16]
を出力してみればいいだろうに。
頭悪いなあ。
0737デフォルトの名無しさん05/01/21 00:03:43
で、本人は>>736のを試してみたか?

どうなった?
073873205/01/21 00:08:11
for (i=0; i < strlen(cycleno); i++) {
        printf(" %c, ",cycleno[i]);
}

/******* 実行結果 **********/
1,  2,  3,  4,  5,  6,  7,  8,  9,  0,  ,  B,  F,  ,  , ,


>>736-737
やってみた。
ら、なおさらわかんなくなりました。
間にちらほらNULL文字っぽいの入っとる。

0739デフォルトの名無しさん05/01/21 00:12:08
>>738
%2x にしてみれ
0740デフォルトの名無しさん05/01/21 00:21:02
で、本人は>>739のを試してみたか?

どうなった?
074173205/01/21 00:22:50
for (i=0; i <= strlen(cycleno); i++) {
    printf("%2x, ",cycleno[i]);
}

31, 32, 33, 34, 35, 36, 37, 38, 39, 30,  1, 42, 46, ffffff83,  4,  8,  0,

>>739-740
NULL文字かと思ったら別の制御文字だったです。
やっぱ隣りの無関係領域の'\0'出るまで読み込みでビンゴだったようです。
どうもありがとうです。

つまり
終端がNULL文字でない文字列にstrlenや%sをかけるのは不正アクセスを
引き起こすので普通やっちゃいけない、
・・・って結論でよいですかね ´∀`
0742デフォルトの名無しさん05/01/21 00:25:18
くだらん質問○投げスンナ
0743デフォルトの名無しさん05/01/21 00:25:34
>>741
OK
0744デフォルトの名無しさん05/01/21 00:26:39
たったこの程度のこと理解するのにどれだけ
時間かかってんだよ
0745デフォルトの名無しさん05/01/21 00:29:21
人生こんなもんだ
0746デフォルトの名無しさん05/01/21 00:36:52
> printf("%c,",cycleno[i]);


ぼけ %c でやって見えるわけねーだろ! ぼけ
%02 が常識 > ぼけ

さっさと> printf("%02x,",cycleno[i] & 0xff); しろ
0747デフォルトの名無しさん05/01/21 00:37:36
おまえぼけか?

> 終端がNULL文字でない文字列にstrlenや%sをかけるのは不正アクセスを
> 引き起こすので普通やっちゃいけない、

strlenして、何を得たいわけ?
0748デフォルトの名無しさん05/01/21 00:45:59
>>747
今まで気づかなかったおまえが一番ボケ
0749デフォルトの名無しさん05/01/21 00:52:27
別のスレッドで個人的に面白いのあったんだけど、他の言語分からないのでこれをC言語に直してください。

http://pc5.2ch.net/test/read.cgi/tech/1090227743/550
http://pc5.2ch.net/test/read.cgi/tech/1090227743/558

よろしくです。
0750デフォルトの名無しさん05/01/21 02:01:05
int main(int argc, char **argv)
{

日下部先生


}
0751デフォルトの名無しさん05/01/21 08:07:43
せっかくここ3年ほどよりつかなくなったのに、呼ぶんじゃねーよ!
0752デフォルトの名無しさん05/01/21 08:40:21
グーグルの検索後のURLみたいに%12%34...となっているようなのを表示したいんですけど、printfで普通に表示しようとしても数字に置き換えられてしまいます
何とか表示する方法はないでしょうか?
0753デフォルトの名無しさん05/01/21 08:54:32
>752
sscanf(buf,"%%%02x",&c)
0754デフォルトの名無しさん05/01/21 08:56:45
buf2[i++]=c;
0755デフォルトの名無しさん05/01/21 08:57:55
printf("%s\n",buf2);
0756デフォルトの名無しさん05/01/21 09:13:51
#include <stdio.h>
int main(){
char string[] = "日本語?";
int i = 0;
while (string[i]!='\0') printf("%%%02X", 0xff & string[i++]);
return 0;
}
0757デフォルトの名無しさん05/01/21 15:21:31
ランダムでファイルから一行ぬきだすのって
どうやるんですか?教えてください
0758デフォルトの名無しさん05/01/21 15:23:53
rand()でどれか一行選べばいい
0759デフォルトの名無しさん05/01/21 15:42:58
カレントディレクトリに指定した名前のファイルが存在するか調べてくれるような関数はありますか?
0760デフォルトの名無しさん05/01/21 15:47:32
>>759
環境依存。標準関数ではない。
076175905/01/21 15:53:52
>>760
そうですか・・・・。
例えばWindowsならどんな関数がありますか?
0762デフォルトの名無しさん05/01/21 15:55:16
>>761
Windowsは知らん。ググれば解かると思うが。
076375905/01/21 15:55:44
>>762
分かりました。
0764デフォルトの名無しさん05/01/21 15:58:50
すみません質問の仕方が不適切でした
タイピングもどきを作ってるんですけど、ファイルから
ランダムに一行ぬいて、キーボードでうちこんで、strcmpで正誤判定
ってのを作ってて、ファイルを上から読んでいく事はできたんですけど
rand()って0〜指定した数字までをランダムに指定するってものですよね?
これをどう用いればファイルからの抜き出しができるんですか?
初心者なものでお願いします
0765デフォルトの名無しさん05/01/21 16:02:38
>>759
一般的に、stat()は割りと環境を問わずあると思う。
また、読めることを以って存在すると仮定していいのなら、fopen()してみればいい。
0766デフォルトの名無しさん05/01/21 16:05:18
>>764
一旦、メモリに読み込むのが常套手段かと。
076775905/01/21 16:06:26
>>765
ありがとうございます。
調べてみます。
0768デフォルトの名無しさん05/01/21 16:08:00
>>764

char** str;
str=(char**)malloc(〜…

行番号=(int)((double)行数*((double)rand()/RAND_MAX));
printf("%s",str[行番号]);//なんなりと
0769デフォルトの名無しさん05/01/21 16:17:28
引数って何でつか?
0770デフォルトの名無しさん05/01/21 16:25:22
void mian(void)
の括弧の中へvoidをなぜ書かなきゃならんとでつか?
0771デフォルトの名無しさん05/01/21 16:28:25
>>770
main(void)は引数がないことを意味し、
main()だと引数は不定だということを意味する。
ちなみにC++だと共に前者の意味になる。
0772デフォルトの名無しさん05/01/21 16:29:12
なあんだ、誰も応えられないんでつね
0773デフォルトの名無しさん05/01/21 16:32:49
>>771
サンクスコ。
voidを明記しないと不貞の浮気者になるんでつね。
0774デフォルトの名無しさん05/01/21 16:57:29
善意に甘えるついでにさらに質問させてもらいまつ。

プロトタイプ宣言で
void function(void)
と宣言していても、下のほうでvoidを記述しなくてもいいんでつか?
void funtion()
{
printf("ほにゃらら");
}
こんな感じで。
0775デフォルトの名無しさん05/01/21 17:17:28
>>774
OK。2つは合成される。
ところでmain関数の戻り値はintが正しい。
0776デフォルトの名無しさん05/01/21 17:32:38
>>775
そうでなくてはいけないわけでもないけれど、その方がいろんな面で有益。
0777デフォルトの名無しさん05/01/21 17:39:18
うんとね、setMessage(String s)と書いとけば、
後はmainメソッドに書いてるように
method1.setMessage("ええんか");のように
括弧の中に具体的な値を好きなようにかけるんですよね?
0778デフォルトの名無しさん05/01/21 17:39:48
>>775-776
ありがとさん。

プロトタイプ宣言でvoidを書いておけば
下のほうで書かなくてもいいんでつね。

で775のmainの戻り値をintでってのはなぜでつか?
0779デフォルトの名無しさん05/01/21 17:52:46
終了コードも知らんのか。いやはや世も末だ
0780デフォルトの名無しさん05/01/21 18:51:19
余談だけど、ファーム系だと void main() だったりすることもあったりする。
0781デフォルトの名無しさん05/01/21 20:00:11
>>780
それはシェル使わんし、Mainを終わることは電源切るときだけだから。
0782デフォルトの名無しさん05/01/21 20:02:38
>>781
馬鹿はすっこんでろ
0783デフォルトの名無しさん05/01/21 20:09:20
782:デフォルトの名無しさん:05/01/21 20:02:38
>>781
馬鹿はすっこんでろ
0784デフォルトの名無しさん05/01/21 20:13:11
なんかまた始まったな。読んだことないやつはC99の5.1.2.2.3でも読んどけ。
■ このスレッドは過去ログ倉庫に格納されています