■右詰め%3d ■左詰め%-3d ■零埋め%03d ■まとめ(コンパイル可能) ■実行結果
カテゴリー: 未分類
【C言語】
【C言語】
fopen/fclose/fgets/fputsを使った単純なcat風コマンド
警告: 指定したファイルを標準出力するだけ ■単純なcat風コマンド こんな時に役に立ちます。 (1)forとwhileどちらを使うか悩んだ時(2)fgets()の引数の順番を忘れた時(3)fputs()の引数の順番を忘… 続きを読む 【C言語】
fopen/fclose/fgets/fputsを使った単純なcat風コマンド
【C言語】
エネルギー充填120%と書きたい
warning: invalid conversion specifier ‘\x0a’ [-Wformat-invalid-specifier] 警告: 無効な変換指定子 ‘ \x0… 続きを読む 【C言語】
エネルギー充填120%と書きたい
【C言語】
free(ptr)しても
ptrはNULLにならない
■何と表示されますか? freeしたらfree関数がポインタをNULLにしてくれると思っている人!残念ですが間違っています。 参考: CFAQ-4.8: 呼んだ側のポインターの値は変わらなかった。
【C言語】
fclose()忘れた!
デバッグ関数がバグってる
warning: leak of FILE ‘fp’ [CWE-775] 警告: fclose忘れ[-Wanalyzer-file-leak] ■デバッグ関数のバグ 何度もfopen()を実行してfclose()していな… 続きを読む 【C言語】
fclose()忘れた!
デバッグ関数がバグってる
【C言語】strchr関数の返り値をチェックする
■返り値のNULLチェックを手抜きする このプログラムは返り値のNULLチェックを行っていないので、カンマが見つからないとNULLポインタ間接参照が発生して異常終了する可能性があります。 ■返り値のNULLチェックをする… 続きを読む 【C言語】strchr関数の返り値をチェックする
【C言語】
2次元配列は止めておけ
(新幹線の停車駅)
warning: initializer-string for char array is too long 警告:文字列長は人間が数えてはダメ[-Wexcess-initializers] ■推奨しない2次元配列 この… 続きを読む 【C言語】
2次元配列は止めておけ
(新幹線の停車駅)
【C言語】
論理演算子a||b&&cの
結合規則と評価順序は別
warning: ‘&&’ within ‘||’ 警告:a||b&&cはa||(b&&c)と同じで(a||b)&&… 続きを読む 【C言語】
論理演算子a||b&&cの
結合規則と評価順序は別
【C言語】64bitへ移行(gcc版)
■long 32bit=4byteではなくなったがintは32bitのまま gcc LP64モードで long は64bit=8byteです。U4の様な型定義はサイズが変わってしまいます。よく間違えますがLP64モードで… 続きを読む 【C言語】64bitへ移行(gcc版)
【C言語】 static関数のプロトタイプ宣言を書くのが面倒臭いと思うのが正しい
■static関数のプロトタイプ宣言を書くのが面倒くさい 業務で、「ソースコードを上から下へ読めるようにmain()関数を上に書く」とルール化して、static関数のプロトタイプ宣言を何百行もコメント付きで記述するプロジ… 続きを読む 【C言語】 static関数のプロトタイプ宣言を書くのが面倒臭いと思うのが正しい
【C言語】enum では最初の定数は非ゼロにするか、あるいはエラーを示すものにする
■デバッグを楽にする小技 上記のプログラムでenumの先頭でSun=1の設定をしていないと、初期化していない xを引数にしてnum2Week(x)を呼んだ場合”日曜日”が表示され(る事が多く)問題検出が困難となる。 参考… 続きを読む 【C言語】enum では最初の定数は非ゼロにするか、あるいはエラーを示すものにする
【C言語】
深いネストは理解しにくいので条件をひっくり返して早く返るとネストが浅くなる
■深いネストは理解しにくい ■条件をひっくり返して早く返るとネストが浅くなる ネストが浅くなりコードが単純になります。 ■まとめ(コンパイル可能な検算)
【C言語】マルチステートメントの勧め
■シングルステートメント ■マルチステートメント(推奨) 表のように書ける時は、ぱっと見ただけで瞬間的に理解できるのでマルチステートメントがお勧めです。 参考: プログラム言語 C の推奨されるスタイルとコーディング規範… 続きを読む 【C言語】マルチステートメントの勧め
Cだと思っていたらC++だった
error C2440: ‘初期化中’: ‘void *’ から ‘char *’ に変換できません。 警告:C言語なのにC++コンパイラ使ってる?… 続きを読む Cだと思っていたらC++だった
【C言語】
ダングリングポインタ
(Dangling Pointer)の見つけ方
warning: Use of memory after it is freed 警告:無効な領域を指しているポインタ [clang –analyze] ■解放済み領域を指すダングリングポインタ ■終了した自… 続きを読む 【C言語】
ダングリングポインタ
(Dangling Pointer)の見つけ方
【C言語】
バッファオーバーフロー
(buffer overflow)の見つけ方
ERROR: AddressSanitizer: stack-buffer-overflow on address [gcc -fsanitize=addres][gcc -Wall -Wextra -O3] ■バッファ… 続きを読む 【C言語】
バッファオーバーフロー
(buffer overflow)の見つけ方
【C言語】strcpyとstrcat関数をダラダラ書いて文字列連結しないでsprintfを使う
■strcpy+strcatをダラダラ書く 編集後のイメージがわかりにくいです。 ■sprintfで1行で書く 編集後のイメージがつかみやすいです。 ■まとめ(コンパイル可能) ■実行結果
【C言語】double-fclose
(CWE-1341)
warning: double ‘fclose’ of FILE ‘fp’ warning: leak of FILE ‘fp’ 警告: fclose多すぎ、少なすぎ[-Wanalyzer-double-fclose][… 続きを読む 【C言語】double-fclose
(CWE-1341)
【C言語】
mallocによるリスト構造と
Use-After-Freeのバグ
warning: use after ‘free’ of ‘p’ 警告:メモリの解放後参照[-Wanalyzer-use-after-free] ■use-after-freeのバグ例 free(p) でp を解放した後… 続きを読む 【C言語】
mallocによるリスト構造と
Use-After-Freeのバグ
【C言語】
strstr関数を使ってコードの不吉な臭いを見つける
■駄目語(grep -f NGワード相当) 駄目語録[]の単語は開発環境で異なります。ご自身の環境に応じて追加削除してください。
【C言語】
size_t型のprintf書式は %zu,%zx
warning: format specifies type ‘int’ but the argument has type ‘unsigned long’ 警告: %dは… 続きを読む 【C言語】
size_t型のprintf書式は %zu,%zx
【C言語】
mallocにキャストは
今時のCコンパイラでは必要ない
error C2440: ‘初期化中’: ‘void *’ から ‘char *’ に変換できません。 警告:C言語なのにC++コンパイラ使ってる?… 続きを読む 【C言語】
mallocにキャストは
今時のCコンパイラでは必要ない
gcc-Wallは警告全部ではない
warning: duplicated ‘if’ condition 警告:if文の条件式が重複 [-Wduplicated-cond][-Wduplicated-branches] ■then節とelse節が同じ 新規… 続きを読む gcc-Wallは警告全部ではない
【C言語】
【<】と【<<】を間違える
warning: ‘<<’ in boolean context, did you mean ‘<’? 警告:<<でなくて<では? [-Wint-in-bool-context] ■【… 続きを読む 【C言語】
【<】と【<<】を間違える
【C言語】
コーディング規約で
思考が止まる
ブラックルールとは?
■嫌いなブラックルール ・char/short/int/long を直接記述する事禁止する・数値を直接記述すること禁止、必ずマクロにする事・変数の宣言は関数の先頭でまとめて行い別の行で全てゼロで一律もれなく初期化する事・… 続きを読む 【C言語】
コーディング規約で
思考が止まる
ブラックルールとは?
【C言語】
今時(C99仕様)の変数宣言と
時代遅れのとりあえず0で初期化
■時代遅れの変数宣言と初期化(非推奨) (1)変数宣言(2)とりあえず0で初期化(3)本当の値設定の3部構成からなるC89仕様時代のよくあるスタイルです。 14行目でyの初期化が漏れているので未初期化の警告が出ます。20… 続きを読む 【C言語】
今時(C99仕様)の変数宣言と
時代遅れのとりあえず0で初期化
【C言語】
Segmentation fault(コアダンプ)を調べる方法
■静的解析で敵を見つける ●gcc -Wall -Wextra -Oでコンパイルして警告を直す clang -Wall -Wextra -Oでもコンパイルして警告を直しましょう。 ●gcc -fanalyzer -O2で… 続きを読む 【C言語】
Segmentation fault(コアダンプ)を調べる方法
【C言語サンプル】
年月日から曜日を求める
■ツェラー(Zeller)の公式で曜日を求める 年月日から曜日を求めるのに有名なツェラーの公式をC言語化してます。 1月2月が前年の13月14月になったり、4,100,400の閏年関連の定数が 筆者には難解なので、オリジ… 続きを読む 【C言語サンプル】
年月日から曜日を求める
【C言語サンプル】
日付の引き算を年月日で表示
■サンプルコード 遊び方 $./a.out 1998/08/10 コピペしコンパイル&実行し、動作確認をして下さい。
【C言語サンプル】
GNU拡張機能のswitchを使って西暦を和暦(元号)に変換
■西暦を和暦(元号)に変換 例: 2023/06/03 ->令和/5年/06/03 GNUの拡張機能を使用するとcase 18680908 … 19120729:のように、case 文の範囲指定が出来ます。 gcc… 続きを読む 【C言語サンプル】
GNU拡張機能のswitchを使って西暦を和暦(元号)に変換
【C言語】
char *argv[]は
2次元配列と違う
■char *argv[]サンプルコード ■2次元配列サンプルコード ■argvと2次元配列の違い このプログラムの場合 (1) 2次元配列は末尾に番兵のNULLポインタを置けない。(2) 2次元配列は行 x 列のメモリ… 続きを読む 【C言語】
char *argv[]は
2次元配列と違う
【C言語サンプル】
コマンドラインから3つの整数を入力し大きい順に並べる
■max()/min()マクロの使用例 遊び方 $./a.out 1 10 5 コピペしコンパイル&実行し、動作確認をして下さい。
【C言語】
オーバーフローと
オーバーランの違い
(overFlow VS overRun)
warning: unsigned conversion from ‘int’ to ‘unsigned char’ changes value from ‘305419896’ to ‘120’ 警告: ‘… 続きを読む 【C言語】
オーバーフローと
オーバーランの違い
(overFlow VS overRun)
【C言語サンプル】
union(共用体)を使った エンディアン変換
■16bit(2byte)をスワップする ■32bit(4byte)をスワップする ■64bit(8byte)をスワップする ■標準関数を使ったバイトスワップ ■union(共用体)を使ったスワップ(まとめ)
【C言語サンプル】
西暦から干支を求める
■strcpyを使って干支を求める 意図した動きをしますが記述量が多くて、処理速度も遅いです。。 strcpyで文字列を返却値に使う配列にわざわざコピーしていますが無駄です。 ■文字列リテラルを使って干支を求める str… 続きを読む 【C言語サンプル】
西暦から干支を求める
【C言語サンプル】
円周率の求め方 (ライプニッツの公式)
■円周率の求め方ソース全文 ●ライプニッツの公式使用 π/4 = 1 – 1/3 + 1/5 – 1/7 + 1/9 – 1/11 + … ●M_PIやM_PILは標準じゃないそうです… 続きを読む 【C言語サンプル】
円周率の求め方 (ライプニッツの公式)
【C言語】
自作のstrlen/strncpy/strncmpは標準関数の5~6倍遅かった
■1.パチモノ自作関数を実務で作ってはいけない と別の投稿でも書きましたが どのくらい処理速度が違うのかmem系関数に続いてsrc系関数を自作関数と標準関数で比較してみました。 ■2.自作関数vs標準関数 やっている事は… 続きを読む 【C言語】
自作のstrlen/strncpy/strncmpは標準関数の5~6倍遅かった
【C言語】
sscanf関数の正規表現で
csvファイルを解析し
郵便番号から住所を表示
■このコードで学習できること ・scanfの正規表現・コメントの書き方 ■郵便番号⇒住所プログラム コピペしてコンパイル&実行してみて下さい。 ■製造年と作者名をコメントで明示すると高品質になる 経験則ですが、ファイルヘ… 続きを読む 【C言語】
sscanf関数の正規表現で
csvファイルを解析し
郵便番号から住所を表示
【C言語サンプル】
根性のない電卓
■このコードは手抜きです ・ゼロ割り算をガードしていません。・1+1は出来ますが、1+1+1は出来ません・+-*/の四則演算しか出来ません・演算子が2文字以上の考慮はしていません(<<とか) ■このコードで学… 続きを読む 【C言語サンプル】
根性のない電卓
【C言語】
キャッシュの有無で
二次元配列参照の処理速度は
物凄く違う
■1.要するに安近短が百倍早いらしい for(x;for(yとfor(y;for(xの処理速度を比較してみました。 ■2.for(x;for(y対for(y;for(x やっている事はどちらも2次元配列を文字’QR… 続きを読む 【C言語】
キャッシュの有無で
二次元配列参照の処理速度は
物凄く違う
【C言語】
自作のmemset/memcpy/memcmpは標準関数の20倍遅かった
■1.パチモノ自作関数を実務で作ってはいけない と別の投稿でも書きましたがどのくらい処理速度が違うのか自作関数と標準関数を比較してみました。 ■2.自作関数vs標準関数 やっている事はコピー元の自動変数配列を文字Qで埋め… 続きを読む 【C言語】
自作のmemset/memcpy/memcmpは標準関数の20倍遅かった
【C言語サンプル】
csvファイルを読んで構造体に設定する
■構造体の使い方に慣れましょう コピペしてコンパイル&実行して動作を確認してください。 ■input.csvの例
【C言語サンプル】
strtok関数を使って文字列を単語に分解する方法
■strtokの意味 strtok=string+tokenstring=文字列token=単語strtokは文字列を単語に分解する関数です。 ■strtok関数の使用例 コンパイル&実行してみて下さい。 ※window… 続きを読む 【C言語サンプル】
strtok関数を使って文字列を単語に分解する方法
【C言語】
関数ポインタを使った
配列vsポインタの処理時間計測
■配列vsポインタ 文字列定数を変数に設定する際、以下のように配列とポインタで似たような記述が出来ます。char ary[1024] = “string”;char *ptr = “s… 続きを読む 【C言語】
関数ポインタを使った
配列vsポインタの処理時間計測
【C言語サンプル】
構造体ポインタの使い方
■単純な構造体メンバの参照 ■間接演算子 * と構造体ポインタ 読みにくいのでこのスタイルは通常使用されません。 ■アロー演算子 -> と構造体ポインタ 「構造体ポインタの指す先のメンバ」と自然に読めるので通常このスタイ… 続きを読む 【C言語サンプル】
構造体ポインタの使い方
【C言語サンプル】
今時(C99仕様)の構造体初期化
■構造体の宣言 ■C99仕様の構造体の定義と初期化 ■構造体ポインタを使ったメンバ表示 ■構造体に慣れましょう コピペしてコンパイル&実行して動作を確認してください。
【C言語】
Shift_JISで書いたプログラムをgcc/clangでコンパイルしてはいけない
■1.gccでエラーにならないので困る このプログラムがShift_JISで書かれている場合、いわゆる5C問題で全部コメントになります。 gccで何のエラーもなくコンパイルできますが何もしないプログラムとなります。 エラ… 続きを読む 【C言語】
Shift_JISで書いたプログラムをgcc/clangでコンパイルしてはいけない
【C言語】
printf(“%zu\n”,strlen(“全角”)); 全角は2バイト固定か?
■1.次のプログラムは何と表示されますか? ■2.ソースコードがEUCの場合 プログラマの期待した結果になります。 ■3.ソースコードがShift_JISの場合 プログラマの期待した結果にこの例ではなりましたが、 gcc… 続きを読む 【C言語】
printf(“%zu\n”,strlen(“全角”)); 全角は2バイト固定か?
【C言語】
早期リターンvs関数出口1つ
■1.早期リターンは読みやすい(推奨) コーディング規約 「関数の出口1つだけ」を強要するプロジェクトは多いです。 しかしこのルールを守った読みやすいコードを見たことがありません。 規約を強要する人は是非ともリーダブルコ… 続きを読む 【C言語】
早期リターンvs関数出口1つ
【C言語サンプル】
rand乱数生成関数の使い方
(じゃんけんゲーム)
■乱数の種まき ●srand関数による乱数の種まきをしないと何回実行しても同じ結果となる●実務ではrand関数よりrandom関数を使う ■乱数を生成するrand関数の使い方 srand関数を使用して乱数の種を蒔かないと… 続きを読む 【C言語サンプル】
rand乱数生成関数の使い方
(じゃんけんゲーム)
【C言語】
無料でLinux上のプログラムを
静的解析する方法
cppcheck:clang –analyze:clang-tidy:gcc -fanalyzer
■1.おすすめのツールとオプション (1) clang -Weverything(2) clang –analyze(3) clang-tidy(4) gcc -Wall -Wextra(5) gcc -fa… 続きを読む 【C言語】
無料でLinux上のプログラムを
静的解析する方法
cppcheck:clang –analyze:clang-tidy:gcc -fanalyzer
【C言語】
printf(書式%s)にNULLが渡る時 “(null)”の表示を期待しないこと
■Windows系で許容されるがLinux系ではNG Windows系のコンパイラでは書式%sにNULLポインタが渡ると“(null)”と表示されるそうですが、Linux系(gcc,clang)で… 続きを読む 【C言語】
printf(書式%s)にNULLが渡る時 “(null)”の表示を期待しないこと
【C言語】
長い文字列は複数行に分けて書いてOK!円記号¥も不要
■長い文字列(寿限無) ■短い文字列を連結して長い文字列を作る ■予期せぬ文字列リテラルの連結(例1) C言語では連続する文字列リテラルは連結されます。つまり”文字列A” ”文字列B”は”文字列A… 続きを読む 【C言語】
長い文字列は複数行に分けて書いてOK!円記号¥も不要
【C言語】
文字列配列の要素数を指定すると終端文字’¥0’が入らず暴走する時がある
■1.暴走するstrlen ■2.暴走するprintf ■3.暴走するstrcmp ■4.暴走するstrcpy これらのプログラムが何と表示するかは動かしてみないと誰にもわかりません異常終了するかもしれません。 配列 a… 続きを読む 【C言語】
文字列配列の要素数を指定すると終端文字’¥0’が入らず暴走する時がある