07/04/12 08:32:40
>>785
Cの真偽値の基本は、0でない=真、0=偽
真の場合、0でない値として必ず1を返すケースがいくつか定義されているが、
明言されていない場合は、0でないことだけが保証される。
790:デフォルトの名無しさん
07/04/12 11:41:47
なんで*(s+1)とs[1]の二つの書き方をつくったのよ>K&R
*s++は*にしかできない書き方だし
*(*(s+1)+2)は読みにくいからs[1][2]と書くんだけど
なんか一貫性に欠けてるぞオイ
なんでアメ人は人工言語にこんな汚い要素を持たせるのよ
完璧主義で潔癖症なオレはポインタと配列を使うとき、毎回迷うじゃん
791:デフォルトの名無しさん
07/04/12 11:53:05
>>790
*を使わなければいい。
*s++なんてロジックは却って最適化を阻害しかねない。
s[offset++]でいいジャマイカ。
792:デフォルトの名無しさん
07/04/12 11:56:03
読み込むファイルにひらがなあったら駄目だけどね
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define BUF_SIZE 16
int main()
{
FILE *fp;
char filename[1024] = {'\0'};
char buff[BUF_SIZE] = {'\0'};
char *temp = NULL;
size_t len = BUF_SIZE;
fgets(filename,sizeof(filename),stdin);
if(temp = strchr(filename, '\n'))
*temp = '\0';
fp = fopen(filename, "r+b");
while(len == BUF_SIZE){
unsigned int i;
len = fread(buff, 1,BUF_SIZE , fp);
for(i = 0; i < len; i++)
printf("%02x ",(unsigned char)buff[i]);
for(; i < BUF_SIZE; i++)
printf("-- ");
for(i = 0; i < len; i++){
int c = buff[i];
if(isspace(c)) c = ' ';
putchar(c);
} putchar('\n'); } fclose(fp);
return 0;
}
793:デフォルトの名無しさん
07/04/12 12:47:04
>>791
そうなんだけど
*s++ = *t++みたいな記述は確かに便利だし
s[i]は添え字の分のメモリーも必要だし
ちと読みにくくなるけど
*(*(s+1)+2)でいくか
794:デフォルトの名無しさん
07/04/12 13:01:03
>>793
>s[i]は添え字の分のメモリーも必要だし
ダウト。
今時のコンパイラはどっちで書いても同じコードを吐いてくれる(ことが期待できる)。
795:さいきち
07/04/12 13:05:57
教えてください。C言語を勉強し始めたひよっこです。
Cコンパイラ(Borland C++)をPCにインストールして、コンパイルしようとしたら
以下のようなエラーがでてウマく行きません。何が原因なのでしょうか?
エラー E2209 sample1.c 5: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample1.c 10: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main )
10日でおぼえるC言語入門 という本を見て勉強を始めたのですが勉強を進めきれず
困っています。
どなたか教えてください。
796:デフォルトの名無しさん
07/04/12 13:06:10
* は直接参照する時しか使わないな。
インデックスを使うときは必ず [ ] を使う。
その方が読みやすい。
全てのループは if と goto で書けるが
そう書かないのと同じ事だ。
分かりやすく書くのが至上。
後の事は最近のカシコイコンパイラが最適化してくれる。
797:デフォルトの名無しさん
07/04/12 13:11:11
>>795
このあたりから setbcc とかを参考にしてみるといいかもしれない。
URLリンク(lacc.biz)
798:さいきち
07/04/12 13:17:18
大変申し訳ありません。795で質問しました さいきち です。
わたくしはルール違反をしてしまいました。過去ログを調べていません。調べて見ます。
795の質問は『無視』でお願いいたします。
799:デフォルトの名無しさん
07/04/12 15:49:17
>>798
つい最近まったく同じ質問があって、インストールしたbccがアップデート版だった
というのがあったな。
800:デフォルトの名無しさん
07/04/12 16:20:45
argv[1]とargv[1][0]ってどう違うのですか?
どちらも一つ目のオプションを指してると思うんですが
printf( "%p %p\n", argv[1], argv[1][0] );
で表示させると違う値になります
801:デフォルトの名無しさん
07/04/12 16:24:04
>>791>>794>>796
コンパイラがちゃんと最適化してくれるのか 知らなかった
これからは[]で統一する
やっぱ*(*(s+1)+2)なんて書かれたらウザいよねw
802:デフォルトの名無しさん
07/04/12 16:25:44
>>800
argv[1] はchar*
argv[1][0] は char
803:デフォルトの名無しさん
07/04/12 16:27:14
argv[0]は&argv[0][0]と同じってことですね
804:766
07/04/12 16:36:19
構造体のなかのintをcharに全部変えたらbase64の文字列が短くなって通信ができるようになりました
>>760さんありがとうございました。><
805:デフォルトの名無しさん
07/04/12 18:42:57
入力した数字が0ではない間ループするってやつで
int aho[100];
int i=0;
while(aho[i]!=0){
scanf("%d",&aho[i]);
i++;}
ってやると0入力してもおわらんのだけどなんでじゃ?
806:デフォルトの名無しさん
07/04/12 18:51:52
>>805
標準入力からaho[0]に数値が入力されてるのに、while文の判定ではaho[1]
見てるからじゃね?
807:デフォルトの名無しさん
07/04/12 18:54:45
>>805
「入力した数字」なのだから、入力前に検査しちゃダメだろう。
do {
scanf("%d", & aho[i]);
++i;
} while (aho[i - 1] != 0);
or
int tmp = 0;
do {
scanf("%d", & tmp);
aho[i] = tmp;
++i;
} while (tmp != 0);
いずれにしても、scanf()をそのまま使うのはお勧めできないが。
808:デフォルトの名無しさん
07/04/12 20:37:29
>>806~>>807
ほんとだw
ありがとう
809:デフォルトの名無しさん
07/04/12 21:05:32
>>800
別に配列にしたからって、より最適化してくれるってわけでもないがな。