Shammer's Philosophy

My private adversaria

C

標準入力から文字を読み込む【その4】

C

標準入力から文字を読み込む際、標準入力から文字列を読み込む【その3】 - Shammerismの通り、一時的に文字列の入力を受け取る buffer を普通に用意することに。単純に fgets で読み込ませてみたが、 #include <stdio.h> int main(int argc, char * args[]){ char va</stdio.h>…

標準入力から文字列を読み込む【その3】

C

標準入力から文字列を読み込む【その2】 - Shammerism以来、標準入力から文字列を読み込む件が中途半端になっていた。 考えられる方法として、1. 文字列格納用ポインタ変数を宣言 2. 文字入力を受付ける 3. 一文字だけ読み込む 4. 読み込んだ文字が改行でな…

標準入力から文字列を読み込む【その2】

C

標準入力から文字列を読み込む【その1】 - Shammerismの続きで、変数宣言部をポインタにしてみた。 #include <stdio.h> #include <string.h> int main(int argc, char * args[]){ char * value; printf("Type message:"); fgets(value, sizeof(value), stdin); printf("%s\n", </string.h></stdio.h>…

標準入力から文字列を読み込む【その1】

C

昔やったような気がしていたが見つからないので。。。一番の基本型は以下だろうか。入力バッファクリア方法 - Shammerismをベースにscanfは使用しない。fgetsを使用する。 #include <stdio.h> #include <string.h> int main(int argc, char * args[]){ char value[10]; printf("</string.h></stdio.h>…

char[] のサイズ

C

char[] で文字列データを宣言する際、あらかじめ領域を確保しておく必要がある。strlen では、最後の '\0' はサイズに含まれていなかったけれども、宣言する際には含めておかなければならないようだ。以下のようにすれば問題なくコンパイルできるが、 #inclu…

char* と char[]

C

char[] として文字列データを宣言した場合は、最後に '\0' を入れないといけない。この場合のサイズの差が気になったので確認してみた。 #include <stdio.h> #include <string.h> int main(int argc, char* args[]){ char * value = "0123456789"; char array[] = {'0','1','2',</string.h></stdio.h>…

文字列の連結

C

strcat という関数があると知ったので、早速試してみた。2 つの引数を取るようなので、戻り値が連結された文字になるのかなと思い、以下のように書いてみたが、Segmentation fault になってしまう。 #include <stdio.h> #include <string.h> int main(int argc, char* args[]){ </string.h></stdio.h>…

出鱈目な引数の型を指定しても・・・

C

環境変数取得方法 - Shammerismで、main 関数の引数は、int 型、char*型、char*型という順序になるということがわかった。これを一歩進めて、この型を滅茶苦茶にしたらどうなるかやってみた。Java だとエラーになってくれる。 #include <stdio.h> int main(char argc,</stdio.h>…

変数の最大値・最小値

C

以下のコードを実行すればわかる。 #include <stdio.h> #include <limits.h> int main(int argc, char* args[]){ printf("Char : %d - %d\n", CHAR_MIN,CHAR_MAX); printf("Integer : %d - %d\n", INT_MIN, INT_MAX); printf("Long : %ld - %ld\n", LONG_MIN, LONG_MAX); printf</limits.h></stdio.h>…

HTTP Client ver 0.2

C

HTTP Client ver 0.1 - Shammerismの内容に、nslookup sample C version - Shammerismの内容を追加してみた。 #include <ctype.h> #include <netdb.h> #include <regex.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> int is_valid_ipaddr(char v[]){…</netinet/in.h></arpa/inet.h></unistd.h></string.h></stdlib.h></stdio.h></regex.h></netdb.h></ctype.h>

nslookup sample C version

C

Shammerismの内容をベースに C 言語版の簡易 nslookup を書いてみた。 #include <arpa/inet.h> #include <err.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main(int argc, char *args[]){ if( argc == 2 ){ // Local values struct addrinfo hints, *res, *res0; int error;</unistd.h></string.h></stdio.h></netdb.h></err.h></arpa/inet.h>…

HTTP Client ver 0.1

C

手始めに、引数で指定されたアドレスの80ポートへ接続し、デフォルトページを取得、表示するだけのクライアントを書いてみた。 #include <ctype.h> #include <regex.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> int is_valid_ipaddr(char v[]){ regex_t p</netinet/in.h></arpa/inet.h></unistd.h></string.h></stdlib.h></stdio.h></regex.h></ctype.h>…

正規表現でIPアドレス判定ーC言語ー完成

C

正規表現でIPアドレス判定ーC言語ーその11 - Shammerismの続きにして、IP アドレスチェック完成バージョン。 #include <ctype.h> #include <regex.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char* args[]){ if( argc == 2 ){ regex_t preg; int regcompresult; r</string.h></stdlib.h></stdio.h></regex.h></ctype.h>…

正規表現でIPアドレス判定ーC言語ーその11

C

正規表現でIPアドレス判定ーC言語ーその10 - Shammerismの続き。0 から 255 までであればOKとする正規表現。 #include <ctype.h> #include <regex.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char* args[]){ if( argc == 2 ){ regex_t preg; int regcompresult; r</string.h></stdlib.h></stdio.h></regex.h></ctype.h>…

正規表現でIPアドレス判定ーC言語ーその10

C

正規表現でIPアドレス判定ーC言語ーその9 - Shammerismで、数字二桁の正規表現に成功。 だが、行頭と行末記号を二度含む表現になってしまったので、これを一つずつにする正規表現を考える。 括弧を使用すればいいと思うのだがどうだろうか。。 #include <ctype.h> #i</ctype.h>…

正規表現でIPアドレス判定ーC言語ーその9

C

正規表現でIPアドレス判定ーC言語ーその8 - Shammerismで、数字一桁の正規表現に成功。 次のステップとして、1 から 99 までの場合に OK となるような正規表現を考える。 十の位が 0 になることはないので、一桁の正規表現に"OR"を追加する形で実現させる。…

正規表現でIPアドレス判定ーC言語ーその8

C

正規表現でIPアドレス判定ーC言語ーその7 - Shammerismの実装では、 判定文字が数字を含んでいればOKと判定してしまったので、行頭と行末記号を追加し、 数字のみであればOKと判定するようになるかを確認してみた。 #include <ctype.h> #include <regex.h> #include <stdio.h> #include <stdlib.h></stdlib.h></stdio.h></regex.h></ctype.h>…

正規表現でIPアドレス判定ーC言語ーその7

C

正規表現でIPアドレス判定ーC言語ーその6 - Shammerismの実装でも期待した結果を得られず。そのため、もっと話を単純にしてみることにした。手始めに、一桁の数字であればOKと判定する正規表現にしたい。以下のようにしてみた。 #include <ctype.h> #include <regex.h> #inclu</regex.h></ctype.h>…

正規表現でIPアドレス判定ーC言語ーその6

C

なかなか目的のことをできるようにならない。正規表現でIPアドレス判定ーC言語ーその5 - Shammerismで、文字列として判定されているためではないかと思ったので、それを試してみることに。実装は以下。 #include <ctype.h> #include <regex.h> #include <stdio.h> #include <stdlib.h> #include <string.h> </string.h></stdlib.h></stdio.h></regex.h></ctype.h>…

正規表現でIPアドレス判定ーC言語ーその5

C

正規表現でIPアドレス判定ーC言語ーその4 - Shammerismの続き。大ボケかましていたので仕切り直しで再実装。以下のコードを試す。 #include <regex.h> #include <stdio.h> int main(int argc, char* args[]){ if( argc == 2 ){ regex_t preg; int regcompresult; regcompresul</stdio.h></regex.h>…

正規表現でIPアドレス判定ーC言語ーその4

C

正規表現でIPアドレス判定ーC言語ーその3 - Shammerismで予想した、regcomp の最後の引数を REG_NOSUB だけにする実装を試してみた。 #include <regex.h> #include <stdio.h> int main(int argc, char* args[]){ if( argc == 2 ){ regex_t preg; int regcompresult; regcompre</stdio.h></regex.h>…

正規表現でIPアドレス判定ーC言語ーその3

C

正規表現でIPアドレス判定ーC言語ーその2 - Shammerismの実装がうまく動かないので 正規表現に問題ないかを確認。正規表現初心者の自分には、頭で考えるよりも打ち込んで期待通りの 結果を返すか確認する方が早い。というわけで、以下のコードを試す。1から…

正規表現でIPアドレス判定ーC言語ーその2

C

正規表現でIPアドレス判定ーC言語ーその1 - Shammerismの続き。正規表現を使用するには、 パターンのコンパイル(regcomp) コンパイルされたパターンを使用しての比較(regexec) という順番で行われるようだ。 そして、regexec の引数、pmatch や nmatch は、…

正規表現でIPアドレス判定ーC言語ーその1

C

HTTPクライアントを書いてみようと思っていたが、引数で渡された文字がIPなのかホスト名なのかを判定できるようにしたいと思った。そして、それぞれの場合で動作を変えたい。これを可能にするには、引数がIPアドレスかどうかを判定できる必要がある。まず、I…

クライアントのポートを固定するーC言語版ー

C

Socketアプリケーションを作成した場合、 サーバーは特定のポートにbindし、そのポートでlistenする クライアントはエフェメラルポートを使用する(ポートは意識しない) というのが通常。 しかし、何らかのテストなども目的でクライアントのポートを固定し…

getnameinfo-sample

C

getnameinfo-sample_beta - Shammerismの実装では、サービスが 0 になってしまうと思っていたが、単純なミスだった。getaddrinfo の第二引数を NULL にしていたことが原因。この点を修正してうまくいった。最終バージョンは以下。 #include <arpa/inet.h> #include <err.h> #incl</err.h></arpa/inet.h>…

getnameinfo_sample調査

C

自分の実装が期待通りに動作していないので原因を調べていたところ、以下のサイトを見つけた。 http://www.koutou-software.co.jp/junk/howto-independ-addfamilysock.html結構長いページだが、下の方にgetnameinfoのサンプル使用例とかがある。まだ詳細を見…

getnameinfo-sample_beta

C

getnameinfo-sample_alpha - Shammerismの内容から、getnameinfo を使用する際にはIPアドレスをベースに動作させたい、と思い考えてみた。getnameinfo に必要な入力は sockaddr 構造体。IPアドレスから sockaddr 構造体を手に入れるには・・・ということで、…

引数を変数に代入する理由

Cの場合はほぼ確実に、Javaでも以下のようなコードを見かけることがある。 void foo(int x, int y) { int a = x; int b = y; ... }コードだけの話だと、この関数内ではそのまま x や y といった変数名で目的の値を参照できるのに、あえてローカル変数に入れ…

getnameinfo-sample_alpha

C

とりあえず、man コマンドにあるヘルプを参考に書いてみた。 #include <arpa/inet.h> #include <err.h> #include <netdb.h> #include <stdio.h> #include <string.h> int main(int argc, char* args[]){ if( argc == 2 ){ // man getnameinfo sample // struct sockaddr *sa; /* input */ // char hbuf[NI_MAX</string.h></stdio.h></netdb.h></err.h></arpa/inet.h>…