C言語講座12回目。
今回は、C言語の豆知識を紹介します。
C言語のちょっとだけお得な豆知識
C言語で知っておくと便利な豆知識を。
・こんな時は、3項演算子
・izeofの結果の勘違いに注意を
・知っていますか、strftime
ハンガリアン記法について
ハンガリアン記法という変数名を付けるときに、接頭語でその型がわかるようにする命名方法があります。
僕もWindowsのプログラムをするときには、マイクロソフトのライブラリやサンプルの真似をして、擬似MS流の記述をしていいて、慣れてくると結構わかりやすくていいです。
参考までにいくつか、接頭語を並べると
型 | 接頭語 | 例 |
ポインタ | p | pList, pStr 等 |
ASCIIZ文字列 | psz, sz | pszName, szBuffer 等 |
論理型 | b,(f) | bTop, bEnd 等 |
整数型 | i, n | iMax, nCount 等 |
符号無整数型 | u | uSize 等 |
長整数型 | l | lValue 等 |
その他、MS流だと構造体の場合、
HANDLE 型は、hFile 等
HWND 型は、 hwndParent, hwndChaild 等
プロジェクトでみんなと開発するときには、プロジェクトのルールがあるかと思いますが、自分で好きに作るときには、自分なりのルールをもっていると悩まなくていいです。
こんな時は、3項演算子
3項演算子というものがあります。
チョットしたときに便利なので、覚えておいて損はありません。
(1)大きい方の値が欲しい。
iMax = (val1 > val2) ? val1 : val2;
(2)ヌル文字チェック
printf("%s\n", (pStr == NULL)? "": pStr);
(3)リターンを簡潔に
return (pValue == NULL)? -1 : 0;
等等、ちょっとしたところで、簡潔に書くことができます。
sizeofの結果の勘違いに注意を
sizeof という演算子があります。
char buf[256];
ならsizeof(buf) は、256です。
ところが,
char* p;
sizeof(p) は、その指し示している先が何であっても、ポインタのサイズです。32ビットのコンパイラであれば、通常4。
p = "hello";とかの場合、文字の長さを取得できるつもりで、sizeof(p)というコーディングをしているのを見かけたこともありますが、意図からすると間違いです。
そんな場合は、 当然strlen を使用しなければなりません。
では、sizeof("hello") は?
答えは、6です。
5文字+1バイトのヌル文字分。
'h','e','l','l','o'の5と思いがちですが、実際には行末のヌル文字分もコンパイラは確保してくれていて、6バイト分になります。
知っていますか、strftime
標準関数、ライブラリ関数は一通り目を通しておいた方がいいいです。
知らないと、関数を使えば1行で済むものを、延々とプログラミングしてしまうからです。
その代表的なものが strftime という関数です。
何につかうか? 以下のような現在時刻の文字列を作るとき。
2020/05/17 10:10:10
C言語のアプリケーション開発時には、現在時刻の文字列を作ることは、ログ出力やプリンタへの出力等もあり、意外に頻繁に発生します。その時どうしているかというと、よく見かけるのが。次のコーディングです。
#include <sys/time.h> char szDate[64]; time_t t1; struct tm *pt; time(&t1); pt = localtime(&t1); sprintf(szDate, "%04d/%02d/%02d %02d:%02d:%02d\n", pt->tm_year + 1900, pt->tm_mon + 1, pt->tm_mday, pt->tm_hour, pt->tm_min, pt->tm_sec);
これは、strftime を使用すれば以下の通り。
char szDate[32]; time_t t1; time(&t1); strftime(szDate, sizeof(szDate),"%y/%m/%d %H:%M:%S", localtime(&t1))
覚えておいて損はありません。
今回はここまでにします。