2012-04-04 61 views
0

この質問は他のものと重複しているかもしれませんが、この変更を行う前に私が正しいと確信したいので、ここで尋ねます。C++ - TCHAR配列が空であることを確認してください

if(NULL== m_sLogPath || _tcsicmp(m_sLogPath, trace_path)!=0){//code here} 

I:

TCHAR m_sLogPath[MAX_LOGPATH_LEN]; 

配列が初期化され、使用されたが、しばらくして、このチェックがあるされているコードの行があります:私は維持しています古いプロジェクトでのコード行がありますm_sLogPathが空であるかどうかを調べるif if文がNULLであるかどうかを推測します。== m_sLogPathは、NULLと配列を比較する意味のないチェックです。私はNULL == m_sLogPathピースを削除する必要があるつもりですが、私の質問は、代わりに配列が空であることを確認する必要がありますか?すべての回答と助けてくれてありがとう

+1

あなたは「しばらく」と言うとき、あなたはまだm_sLogPathを直接扱っているか、それがどの時点で引数として渡されましたか? – sji

+0

おそらくそれを書いた人は、スタック割り当てに関するただのパラノイアです:) –

+1

それは元の配列(それが引数として渡された後になるでしょう)へのポインタならば、それは非常に有効なチェックです。 – sji

答えて

8

同じ文脈で終わったら、それは無意味なチェックです。

関数にパラメータを渡すと、配列はポインタに崩壊し、それほど意味がありません。配列をチェックする代わりに、そこに行くべきか

アレイは決して空で、

まあ空です。常にMAX_LOGPATH_LENTCHARが含まれます。

if(m_sLogPath[0] == _T('\0') || _tcsicmp(m_sLogPath, trace_path)!=0) 
+0

_tcslen関数を使用してください。あなたのコードは世界中のすべてのCコンパイラで動作するはずですが、ある日、Cを知らない人はそのコードを移植する必要があります。 –

+0

Brilliant、ありがとうルーシアン、私はそれを関数のパラメータとして渡すことは決して知らなかった!私はできれば答えるつもりです! – DukeOfMarmalade

+0

@Jimは助けてうれしいです。 –

3

m_sLogPath配列は常にMAX_LOGPATH_LEN文字が含まれています。しかし、次のトリックを行うことができます。 MAX_LOGPATH_LENが0より大きい定数であると仮定すると、配列は決して実際には空にはなりません。

本当にチェックしたいのは、この配列に格納されているCスタイルの文字列が空であるかどうかです。その場合は、それを行うための最も簡単な方法は、次のようになります。

#include <tchar.h> 
#include <windows.h> 

const size_t MAX_LOGPATH_LEN = MAX_PATH; 
TCHAR m_sLogPath[MAX_LOGPATH_LEN]; 

int main() 
{ 
    if (m_sLogPath[0] == _T('\0')) 
    { 
     // m_sLogPath contains empty string. 
    } 
} 
関連する問題