C
文字配列の連結-Version20101105 - Shammerismの内容に配列全体の文字数をカウントする - Shammerismをマージ。 char * concat_string_array(char * array[], int arrayLength){ char * value; if( arrayLength == 1 ){ value = array[0]; } else { int arra…
配列のサイズを同時に渡すようにしておけば何も難しいことはないと思われる。 int string_array_length(char * array[], int arrayLength){ int length, i; for( i = 0, length = 0 ; i < arrayLength ; i++ ){ length = length + strlen(array[i]); } lengt…
文字列の連結-malloc_20101101 - Shammerismに、2つの文字列を連結する関数を書いたが、実際にプログラムを書く際にはもっと多くの文字列を一度に連結したいと思うことが多い。大は小を兼ねる、とも言うので、複数の文字列を一つの文字列として返す関数を書…
文字列の引数を2つ受け取って、それを連結したものを返す、というだけのシンプルな関数。これだけの関数なら普通に標準関数でありそうだが、探しても完全に期待通りのものはないので自作。といっても、文字列の連結 - Shammerismの処理を関数にしただけ。 #i…
文字列が数値かどうか判定する - Shammerismで書いてみたが、動作しないケースがあったので書き直し。 #include <stdio.h> #include <string.h> #include <ctype.h> /* * If v is number, return 1. * If v is NOT number, return 0. */ int checknumber(char *v){ int len = strlen(v); </ctype.h></string.h></stdio.h>…
サーバーを書いてみたので、次はクライアント。 #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> void die_with_error(char *errorMessage) { perror(errorMessage); exit(1); } int main(int argc, char* args…</unistd.h></sys/socket.h></sys/types.h></string.h></stdlib.h></stdio.h></netinet/in.h></arpa/inet.h>
C 言語で書いてみた。というか、TCP/IPソケットプログラミングC言語編の内容をほとんどコピーしているに近いのだが。 #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> void die_with_error(char *errorMessage) { perror(errorMessage); exit(</unistd.h></string.h></stdlib.h></stdio.h></netinet/in.h></arpa/inet.h>…
HTTP Client 作成の一環で、引数に渡された文字列をURLと想定し、そこからプロトコル部分を抜き出すという処理を書いてみた。Cには、期待する形で使用できるsubstringがなかったのでそれを自作し、その自作したsubstringを使用する形で書いてみた。 #include <stdio.h></stdio.h>…
substring 関数 - 20100926 - Shammerismで気になっていた、end が実際の文字列より大きい場合の対処を追加したバージョン。 #include <stdio.h> #include <stdlib.h> #include <string.h> char * substring(const char str[], int s, int e){ int start = s; int end = e; int length = e</string.h></stdlib.h></stdio.h>…
substring 関数を自作してみた。strlen と sizeof の違い、malloc の時にどのようにサイズを指定するかとか、よくわからない部分も多かったが、とりあえず書いてみた。渡した文字列引数の start 文字目から end 文字目まで返す、という点は確認した。でも en…
strstr 関数は、文字列の中でとある文字列を検索し、最初に見つかった位置を返す関数のようだ。 URL を受取り、プロトコル部分のみを返すような関数を書きたい。この strstr が使えるのではないだろうか。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,</string.h></stdlib.h></stdio.h>…
HTTP Client ver 0.23 - Shammerismの内容に、nslookup sample C version - 関数版 - Shammerismの関数を加えた。ようやく、IP アドレスでもホスト名でもアクセスできる状態になった。 #include <ctype.h> #include <err.h> #include <netdb.h> #include <regex.h> #include <stdio.h> #include <stdlib.h> #includ</stdlib.h></stdio.h></regex.h></netdb.h></err.h></ctype.h>…
nslookup sample C version - Shammerismでは、全て main の中に書いていたが、IP アドレスを取得する処理を関数に分けてみた。自分が作成する予定の HTTP Client では、IPv4 のみ使用するつもりなので IPv6 のところは一旦コメントアウト。それなら inet_nt…
文字列を返す関数 - Shammerismでは、関数間でデータをやりとりする際にヒープを使用した。これが普通と思っていたが、単純に char * test1(){ char * v = "0123456789"; return v; } で、呼出元は 0123456789 を把握できた。関数の終了と同時に v の内容も…
char[] のサイズ - Shammerismの内容と少し関係あるかも。 初期値を10として配列を宣言したけれども、実際には10も使用しなかった、という場合、空き領域はどうなるのか確認してみた。どうやら、0 で初期化される。さらに、文字列の場合、strlen を使用する…
C 言語で HTTP クライアントを作ってみよう (2)に有用な情報を発見。Socket も FILE と同じように扱うのがよさそうだ。HTTP Client ver 0.22 - Shammerismで考えた関数化と合わせて以下のように変更。使わない関数もいくつかあるが、今後のメモとして。だい…
HTTP Client ver 0.21 - Shammerismで、応答受信時に処理が停滞してしまう事象はインチキくさいが Connection: close を付与することで一時的に回避。Connection: keep-alive 時には、Content-Length をカウントして受信しきったらクローズするようにしない…
HTTP Client ver 0.2 - Shammerismをちょっとだけ改良した。旧実装では、is_valid_ipaddr が条件によっては何も返さない箇所があった。そのため、コンパイルオプション次第では warning: control may reach end of non-void function [-Wreturn-type]の警告…
HTTP Client を書く際に、URL の判定は必須。その際、: が何文字目にあるとか、? を含んでいるかとか、そういう処理をすることになる。それをするための関数を作成。Javaでいうところのjava.lang.String.indexOfといったところか。まずは、main 関数内で直接…
BohYoh.com【著書】解きながら学ぶC言語の問題の一つとして取り上げられていた。putchar('\r')を使用することで改行せずに同一行の先頭にカーソルを移動できる。そこから文字をずらして表示させていけば、テロップのように表示できる。 #include <stdio.h> #include <string.h></string.h></stdio.h>…
改行とEOF - Shammerismの続き。実装を以下のように変更してみて、どの程度まで getchar() を実行し続けることができるかを試してみた。 #include <stdio.h> int main(int argc, char * args[]){ int i = 0; puts("Type:"); while ( 1 ) { char c = getchar(); if ( c</stdio.h>…
入力バッファクリア方法 - Shammerismでは、getchar() の結果が \n だったら、つまり、改行だったら getchar() を終わりにする、というようにしていたが、どうやら改行での判断は一つの手段でしかないらしい。改行以外にEOFでの判定もできるようだ。 #includ…
あまり馴染ないけれども、C には列挙型というものがあるようだ。あらかじめいくつかの選択肢を用意しておき、それ以外は選択不可というもの。値の指定は不要だが、内部では Integer で扱われているようだ。 #include <stdio.h> enum sample { A, B, C}; int main(int </stdio.h>…
以下のように、宣言した変数の最大値を超えるような計算をした場合、その変数は最小値に戻るようだ。 #include <stdio.h> #include <limits.h> int main(int argc, char * args[]){ int value = INT_MAX; printf("value = %d\n", value); printf("value = value + 1\n"); value </limits.h></stdio.h>…
変数の最大値・最小値 - Shammerismでは、各型の最大値と最小値を確認するプログラムを書いてみたが、今度は使用するメモリ領域を確認するプログラム。 #include <stdio.h> int main(int argc, char * args[]){ printf("sizeof(char) = %u\n", (unsigned)sizeof(char)</stdio.h>…
百聞は一見に如かず。やってみるべし。 #include <stdio.h> int g = 0; void static_test(){ static int x = 0; int y = 0; printf("Global Static Normal\n"); printf("====================\n"); printf("%6d %6d %6d\n", g++, x++, y++); printf("================</stdio.h>…
文字列の連結-snprintf_ver1 - Shammerismの問題を修正。 #include <stdio.h> #include <stdlib.h> #include <string.h> char * returnString(char * v){ char * prefix = "[RES]"; int length = strlen(prefix) + strlen(v) + 1;// 1 is for '\0' char * response = (char *)malloc(lengt</string.h></stdlib.h></stdio.h>…
文字列の連結 - Shammerismでいろいろ悩んでいたが、どうやらsnprintfを使用するのが一番よさそうだ。まず、snprintfを使用しない力技バージョン。 #include <stdio.h> #include <stdlib.h> #include <string.h> char * returnString(char * v){ char * response; response = (char *)mall</string.h></stdlib.h></stdio.h>…
初めて書いてみました。 # Makefile CC=gcc CFLAG=-g all: clean build clean: -rm *.o build: hello.o $(CC) -o hello hello.cポイントは以下。 最初に書かれたアクションが実行される(上の例ではall) ハイフンを付けたアクションは、エラーになっても無視…
文字列を返す関数を書いてみた。非常にシンプルな例だが。。。 #include <stdio.h> #include <stdlib.h> #include <string.h> char * returnString(char * v){ char * response; response = (char *)malloc(strlen(v)); strcpy(response, v); return response; } int main(int argc, char </string.h></stdlib.h></stdio.h>…