[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 23:54 / Filesize : 183 KB / Number-of Response : 810
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 16:45:25 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 9
pc11.2ch.net/test/read.cgi/tech/1173284217/

過去スレ
Part 1 pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 pc11.2ch.net/test/read.cgi/tech/1171946674/

関連スレ
C/C++の宿題を片付けます 84代目
pc11.2ch.net/test/read.cgi/tech/1172981618/
くだすれC言語(初心者用) Part.2
pc11.2ch.net/test/read.cgi/tech/1172099763/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
pc11.2ch.net/test/read.cgi/tech/1170338926/
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1171888583/

【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html

754 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 15:02:25 ]
もうこなくていいよ

755 名前:751 mailto:sage [2007/04/11(水) 15:04:22 ]
>>752-754
ほんとに初心者なのにひどいです><

756 名前:735 mailto:sage [2007/04/11(水) 15:06:39 ]
すみませんなんか偽物がレスして話進んでるんですけど><
>>738から全部偽物です><

757 名前:755 mailto:sage [2007/04/11(水) 15:09:48 ]
なら>>756も偽者ですね><

758 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:04:36 ]
>>735
1バイトづつ16進2桁の文字列にしてしまうとか、あるいはコントロールコード
などの表示不能な文字はエスケープして表示可能な文字にして、表示可能な
文字はそのままにするとか、あるいは表示する必要が全くないのなら気にせず
全部 write() や fwrite() で出力してしまうとか、方法は色々あります。


759 名前:757 mailto:sage [2007/04/11(水) 17:43:19 ]
>>758
>表示不能な文字をエスケープして表示可能な文字にして
文字列←→構造体で相互に変換したいので、文字列から戻す時に
もともと表示可能な文字だったのかエスケープして表示可能になった文字なのか
分からなくなってしまうと思うのでこの場合は使えないです><すいません

ソケットプログラムでsendするときunsigned char型を使うので、
構造体を文字列にしたかったのですが後は何とか自分でがんばってみるです><

760 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:01:36 ]
バイナリを可視なASCII列にするにゃ Base64 エンコが手っ取り早いような気がしないでもない

が、構造体の中身をそのまんまエンコして送るのも抵抗があるな。
受け側のアライメントとエンディアン、基本型のサイズの全てが一致してないといけないしね。

761 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:01:41 ]
>>759
エンコードした文字列は当然、デコードできる。
例えば不可読文字に遭遇したら%に引き続く二文字を16進の文字コードになるようエンコードする。
デコードするときは当然、その逆をやればいい。注意すべきは、%に遭遇した場合もエンコードしておく必要があることだけだ。
Ex.
source: SOH "abc%" LF "def" ETX 20(4バイト整数) EOT
encoded: %01abc%25%0adef%03%00%00%00%14%04


762 名前:759 mailto:sage [2007/04/11(水) 18:06:10 ]
>>760-761
ありがとうございます><すごく勉強になります
%をつける方法だと文字列の長さが一定にならないから送受信のとき大変そうですけど
なんとか考えてやってみます



763 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:11:31 ]
>>762
ソケットの送受信は長さ決め打ちして読むと泣きを見るわけだが…
プロトコルを自前で規定してるか?

# fgets 等を使わずに fread と fwrite で同じことを記述できるようにしてから、
# ソケットへ移行したほうが良いと思うぞ。

764 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:12:28 ]
バイナリ値主体なら>760、テキスト主体なら>761だな。
#どちらも定番だね。

765 名前:762 mailto:sage [2007/04/11(水) 18:43:32 ]
つい最近ソケットプログラムとかを勉強し始めたばかりなのでわからないことばかりで…。
とりあえずBase64というのをやってみることにします><;すいませんでした。

766 名前:765 mailto:sage [2007/04/11(水) 18:58:09 ]
今は文字列と数値を全部snprintfでそのまま繋げてやっていますが
構造体内の変数名とかを全部書かないといけないので
ソースが汚いうえ無駄が多いです><

767 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:59:58 ]
どういう風にやっているのかは知らないが、
そうやって単なる文字列にするのも一般的だと思うぞ。

768 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 19:03:30 ]
構造体のシリアライズは一大テーマで、
ここで扱うには余白が狭すぎるとは思うんだよなあw

769 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 20:11:51 ]
>>713-714
亀ですけど、もし興味わいたなら最強の麻雀のアルゴリズム作ろうぜスレで一緒に最強のアルゴリズムつくりませんか?


770 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:12:05 ]
亀がしゃべった!

771 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:34:43 ]
C始めて3日目の俺がきましたよ。
研修でダンプ出力するPGを作成する課題やってるんだけど、

ファイル開く→開いたファイルから16バイト読み込む
→読み込んだデータの16進数変換を行いHEXに格納する

までは出来たんだが、その後の置換処理がさっぱり分からん('A`)

置換処理はHEXに格納されたデータの表示できないコードを
ピリオドに置換してCHARに格納するんだが、検討もつかないし_| ̄|○

助けてくだしあ

772 名前:デフォルトの名無しさん [2007/04/11(水) 21:40:26 ]
>>771
isprint関数を使う

isprint(c)? c: '.';



773 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:43:06 ]
>>770
亀レスって言葉をご存知?

774 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:44:03 ]
>HEXに格納された
意味が不明すぎる
char配列に16進数の文字を入れてるって事?数値?

775 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:50:02 ]
>>773
く、くまー
ネタにマジレ(ry

776 名前:771 mailto:sage [2007/04/11(水) 22:20:05 ]
参考書片手に悩んでた。

>>772
レストンクス
ちと考えてみるわ。

>>774
HEXには
sprintf(HEX,"%X",ss)
でss内の文字列を16進表示で入れたんだが。
おそらく数値?

777 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 22:25:04 ]
>>768
浮動小数点数を有効桁いっぱいいっぱいまで伝達しようとすると悩ましいね

778 名前:714 mailto:sage [2007/04/11(水) 23:14:51 ]
>>769
いやオレはもうチェスで懲り懲りだよww
プログラム部はだいたい解決策が決まってるけど
思考の部分は定石と言えるような方法がない
(まあ思考とプログラムも明確に分けれるもんじゃないけどね)
これ以上はスレ違いなんでそのスレの住民と一緒にがんばれ!

779 名前:771 mailto:sage [2007/04/11(水) 23:39:22 ]
>>774
自分でも問題の意味を分かってなかったらしい。すまぬ。

HEXDATA          CHARADATA
| ̄| ̄| ̄| ̄| ̄| ̄| ̄| ̄| | ̄| ̄| ̄| ̄| ̄| ̄| ̄| ̄|
*|54|45|53|54| | | | | *|T|E|S|T|. |. |. |. |
 ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄
見づらくてスマヌ('A`)
こんな感じで格納したいわけで。

置換処理でisprint使うっていうのは大体分かったけど、for文で回してなにかしろ
みたいなことを講師が言っていた希ガス。何回したらいいの(;´Д`)??


780 名前:771 mailto:sage [2007/04/11(水) 23:40:09 ]
なんてこったい。
ステキにずれてらっしゃる_| ̄|○

781 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:43:15 ]
数値をCHARADATAにそのまま書けばいいじゃん

782 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:52:39 ]
回すものといえば皿ぐらいしか



783 名前:771 mailto:sage [2007/04/12(木) 00:06:20 ]
レストンクス。
>>781
CHARADATAに書き込むってisprint使ってですかい?

>>782
俺の頭の中で星が回ってるよ。

784 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:10:22 ]
>>783
isprintで表示できないコードを判別して表示できないのならピリオドを、
表示できるのなら、そのコードを代入

785 名前:771 mailto:sage [2007/04/12(木) 00:15:09 ]
>>783
なるほど分かってきた。
isprintで表示できるって判断したときに返す値って何?
表示できないってときは多分0返してくるんだよね?

786 名前:771 mailto:sage [2007/04/12(木) 00:17:48 ]
784の安価ミス

787 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:42:50 ]
>>785
そこまでヒントもらってるんだからマニュアルみなよ。ぐぐってもいいしさ。

788 名前:771 mailto:sage [2007/04/12(木) 00:49:03 ]
ある程度分かったから参考書片手に頑張ってみるわ。
おまいらありがとう

789 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 08:32:40 ]
>>785
Cの真偽値の基本は、0でない=真、0=偽
真の場合、0でない値として必ず1を返すケースがいくつか定義されているが、
明言されていない場合は、0でないことだけが保証される。


790 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 11:41:47 ]
なんで*(s+1)とs[1]の二つの書き方をつくったのよ>K&R
*s++は*にしかできない書き方だし
*(*(s+1)+2)は読みにくいからs[1][2]と書くんだけど
なんか一貫性に欠けてるぞオイ
なんでアメ人は人工言語にこんな汚い要素を持たせるのよ
完璧主義で潔癖症なオレはポインタと配列を使うとき、毎回迷うじゃん

791 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 11:53:05 ]
>>790
*を使わなければいい。
*s++なんてロジックは却って最適化を阻害しかねない。
s[offset++]でいいジャマイカ。

792 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 12:47:04 ]
>>791
そうなんだけど
*s++ = *t++みたいな記述は確かに便利だし
s[i]は添え字の分のメモリーも必要だし
ちと読みにくくなるけど
*(*(s+1)+2)でいくか

794 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:01:03 ]
>>793
>s[i]は添え字の分のメモリーも必要だし
ダウト。
今時のコンパイラはどっちで書いても同じコードを吐いてくれる(ことが期待できる)。

795 名前:さいきち [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:06:10 ]
* は直接参照する時しか使わないな。
インデックスを使うときは必ず [ ] を使う。
その方が読みやすい。

全てのループは if と goto で書けるが
そう書かないのと同じ事だ。
分かりやすく書くのが至上。
後の事は最近のカシコイコンパイラが最適化してくれる。

797 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:11:11 ]
>>795
このあたりから setbcc とかを参考にしてみるといいかもしれない。
ttp://lacc.biz/cpp/cpp01.html

798 名前:さいきち [2007/04/12(木) 13:17:18 ]
大変申し訳ありません。795で質問しました さいきち です。
わたくしはルール違反をしてしまいました。過去ログを調べていません。調べて見ます。
795の質問は『無視』でお願いいたします。

799 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 15:49:17 ]
>>798
つい最近まったく同じ質問があって、インストールしたbccがアップデート版だった
というのがあったな。

800 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:20:45 ]
argv[1]とargv[1][0]ってどう違うのですか?
どちらも一つ目のオプションを指してると思うんですが
printf( "%p %p\n", argv[1], argv[1][0] );
で表示させると違う値になります

801 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:24:04 ]
>>791>>794>>796
コンパイラがちゃんと最適化してくれるのか 知らなかった
これからは[]で統一する
やっぱ*(*(s+1)+2)なんて書かれたらウザいよねw

802 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:25:44 ]
>>800
argv[1] はchar*
argv[1][0] は char



803 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:27:14 ]
argv[0]は&argv[0][0]と同じってことですね

804 名前:766 mailto:sage [2007/04/12(木) 16:36:19 ]
構造体のなかのintをcharに全部変えたらbase64の文字列が短くなって通信ができるようになりました
>>760さんありがとうございました。><

805 名前:デフォルトの名無しさん [2007/04/12(木) 18:42:57 ]
入力した数字が0ではない間ループするってやつで
int aho[100];
int i=0;
while(aho[i]!=0){
scanf("%d",&aho[i]);
i++;}
ってやると0入力してもおわらんのだけどなんでじゃ?


806 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 18:51:52 ]
>>805
標準入力からaho[0]に数値が入力されてるのに、while文の判定ではaho[1]
見てるからじゃね?

807 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/04/12(木) 20:37:29 ]
>>806>>807
ほんとだw
ありがとう

809 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 21:05:32 ]
>>800
別に配列にしたからって、より最適化してくれるってわけでもないがな。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<183KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef