C言語 プログラミング

C言語ポイント・豆知識【C言語プログラミング講座(12)】

C言語講座12回目。

今回は、C言語の豆知識を紹介します。

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))

覚えておいて損はありません。

今回はここまでにします。

-C言語, プログラミング

Copyright© SIMPLEONESOFT (BLOG) , 2022 All Rights Reserved.