素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

c

インデックスを増大/減少させるループとunsigned

c

for (int i = 0; i < N; i++) { /* array[i]を使う */ } というコードについて、iの型はC言語ではsize_tを使うほうが良いのか?という議論から発展して、size_tを使うと減少(降下)ループがきれいに書けなくなる、という問題があがった。 下の話では、size_…

long long int

c

Problem 3 † 13195 の素因数は 5、7、13、29 である。600851475143 の素因数のうち最大のものを求めよ。 http://odz.sakura.ne.jp/projecteuler/index.php?Problem%203 これを解こうとしたら600851475143ってintには収まらないしlongはどれくらいの大きさな…

配列のサイズとsizeof、配列の範囲外への参照

c

追記2:この記事は間違っている。サイズが0の配列はISO Cでは禁止されているので心配する必要はない。 追記:管理人の独り言(プログラミング関連) - 黒歴史集積所によると、この情報は怪しい。 C言語で配列の要素数を求める方法と、微妙な落とし穴について…

関数ポインタを返す関数

c

[09/04/21 23:17:19] qnighy/Acike: C言語で [09/04/21 23:17:31] qnighy/Acike: 関数ポインタを返す関数って [09/04/21 23:17:40] qnighy/Acike: どうやって宣言すればいいのかわからない [09/04/21 23:18:23] daiki chijiwa: っvoid * [09/04/21 23:18:38]…

FizzBuzz

c

FizzBuzzの解法で、i % (3 * 5)をしているコードを結構見る。 3と5が互いに素だからたまたま単純な掛け算で出来るだけなので、きちんと3と5の最小公倍数が15であることが分かるように書くべきだと思う。 /* vim:sw=4 et */ #include <stdio.h> inline int is_divisibl</stdio.h>…

stack

c

#include <stdio.h> #include <stdlib.h> typedef union { int i; char c; float f; } _stack_value_t; typedef struct { _stack_value_t *value; int i; size_t size; } _stack_t; _stack_t *make__stack(size_t size) { _stack_t *_stack = (_stack_t *)malloc(sizeof(_stack_</stdlib.h></stdio.h>…

シェル

c

を参考に作成。ソースがだいぶ古いようで、getsをfgetsに直したりしないとコンパイラが警告を出す。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <strings.h> int main (int argc, char *argv[]) { pid_t pid; int *cstatus; char cmd[256]; printf("></strings.h></stdlib.h></sys/wait.h></sys/types.h></unistd.h></stdio.h>…

ワイルドカード

c

そんなに難しくなさそうなのに、思いのほか大変だった。こういう場合はassert.hを使ってきちんとテストすると安心。 #include <assert.h> int matches(char *pattern, char *text) { do { switch (*pattern) { case '?': text++; break; case '*': return matches(patt</assert.h>…

forのブレース

c

#include <stdio.h> int main(int argc, int argv) { int i; for (i = 0; i < 10; ++i) { int i = i; printf("%d\n", i); } return 0; } % ./a.out 4096 4096 4096 4096 4096 4096 4096 4096 4096 4096 % 未定義値が表示されるみたい。無限ループにはならないのでブロ</stdio.h>…

括弧の対応

c

#include <stdio.h> int brackets(char *str) { int bra = 0; for (; *str; str++) { if (*str == '(') { ++bra; } else if (*str == ')') { if (--bra < 0) return 0; } } return !bra; } int main(int argc, char **argv) { puts(brackets(argc > 1? argv[1]: "")? </stdio.h>…

printfの可変長引数と型

c

printfの第二以降の引数にいろいろな型の物を渡せる仕組みについて。 まず、可変長引数を使うためにstdarg.hを#includeする。 #include <stdarg.h> で、 void myprintf(char *format, ...); のようにプロトタイプを宣言する。 関数の可変部はどんな型でも受け取ること</stdarg.h>…

ポインタと文字列、戻り値

c

追記:コメントを元に修正 ジャンケンゲーム - 素人がプログラミングを勉強するブログで、strcatが文字列を返せば楽なのにと書いたけど、ポインタを渡さなきゃいけない理由がわかった。まず、文字列はプリミティブではないので、関数が文字列を返すときは配…

ジャンケンゲーム

c

追記:メッセンジャーでprintHandイマイチとコメントを貰ったので直した。 strcatとか初めて使ったけど、なんで値入れるためのポインタを渡すようになってるんだろ。関数の戻り値が文字列を返してくれればいいのに。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h></time.h></string.h></stdlib.h></stdio.h>…

sizeof、メモ

c

配列のサイズの取得 - 素人がプログラミングを勉強するブログを書いた後に、配列のサイズを取得する部分を関数にしたらうまくいかなかったので、原因とかをメモ。 #include <stdio.h> int size(int *arr){ return sizeof arr / sizeof arr[0]; } int main(){ int arr[</stdio.h>…

配列のサイズの取得

c

sizeof arrayで、array全体のバイト数を取得して、個々の配列の要素のバイト数で割る。 配列の中身はどれも同じ型だから、[0]のバイト数と、他の要素のバイト数は同じ。 #include <stdio.h> int main(void){ int array[42] = {0}; int array_size = sizeof array / si</stdio.h>…

static変数

c

猫でもわかるC言語プログラミング、148ページまで読んだ。 #include <stdio.h> int counter(void){ static int i = 0; return i++; } int main(void){ int i; for(i = 0;i < 10;i++) printf("%d\n",counter()); // 0, 1, 2, 3, ..., 9 } static変数便利だ。JavaScript</stdio.h>…

動的引数を使ったsum関数

c

動的引数を参考に、引数の数が動的な関数を作ってみた。 けっこう面倒くさい。特に、引数の数を教えなければいけないあたりがスマートじゃないなあ。 #include <stdio.h> #include <stdarg.h> int sum_args(int,...); int main(){ int n = sum_args(10,0,1,2,3,4,5,6,7,8,9); pr</stdarg.h></stdio.h>…

FizzBuzz

c

ここら辺はJavaScriptとあんまり変わらないな。printfが一つ目の引数の文字列によって二つ目以降の引数に渡すものの型が文字列だったり数値だったり変わってるけど、どうやってるんだろう。気になる。 #include <stdio.h> int main(void){ int i; for(i=0;i<=100;i++)</stdio.h>…

#defineの使いかた

c

id:qnighyにいろいろ教えてもらったので。それをそのままメモる。 #include <stdio.h> #define square(E) E*E int main(int argc,char* argv[]) { printf("#define square(E) E*E\n\n"); printf("square(10)==%d\n",square(10)); printf("square(100)==%d\n",square(1</stdio.h>…

C言語できるようになりたい

c

id:gin5005くんもやりはじめるようなので僕も始める。 前によく分からなくて放置した「猫でも分かるC言語プログラミング」っていう本を読み進める。 まず、C言語で書いたプログラムをコンパイルするには、gccってのを使えばいいらしい。 vi test.c gcc test.…