2012-04-04 18 views
0

Ich weiß, dass diese Frage ein Duplikat von einigen anderen sein kann, aber ich möchte sicher sein, dass ich richtig bin, bevor ich diese Änderung mache, also werde ich hier trotzdem fragen. In einem alten Projekt, das ich dort bin Aufrechterhaltung ist diese Codezeile:C++ - Überprüfen, ob TCHAR-Array leer ist

TCHAR m_sLogPath[MAX_LOGPATH_LEN]; 

Es gibt Codezeile, wo das Array initialisiert und verwendet, aber nach einer Weile gibt es diese Kontrolle:

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

I Erraten Sie dies, wenn die Anweisung überprüft, ob m_sLogPath leer ist, aber NULL == m_sLogPath ist eine sinnlose Überprüfung, da der Vergleich eines Arrays mit NULL nicht sinnvoll ist. Ich werde das NULL == m_sLogPath entfernen müssen, meine Frage ist, was sollte dahin gehen, um zu überprüfen, dass das Array leer ist? Danke für alle Antworten und Hilfe,

+1

Wenn Sie sagen, ‚nach einer Weile‘ beschäftigen Sie noch direkt mit der m_sLogPath oder hat sie als Argument an jedem Punkt geführt worden? – sji

+0

Vielleicht ist die Person, die das geschrieben hat, nur Paranoia über Stapelzuweisung :) –

+1

Nur sagen, wenn das ein Zeiger auf das ursprüngliche Array ist (was wäre, nachdem es als Argument übergeben wurde), dann ist das eine sehr gültige Überprüfung. – sji

Antwort

8

Sie haben Recht, das ist eine sinnlose Überprüfung, wenn im gleichen Kontext gemacht.

Wenn Sie es als Parameter an eine Funktion übergeben, zerfällt das Array in einen Zeiger und es ist nicht so sinnlos.

was es gehen sollte stattdessen das Array zu überprüfen ist leer

Nun, das Array nie leer. Es enthält immer MAX_LOGPATH_LENTCHAR s. Aber die folgenden könnte den Trick:

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

Verwenden Sie bitte die Funktion _tcslen. Ich weiß, dass Ihr Code auf allen C-Compilern auf der ganzen Welt funktioniert, aber eines Tages muss jemand, der C nicht kennt, diesen Code portieren. –

+0

Brilliant, danke Luchian, ich wusste nie, dass es als Parameter an eine Funktion übergeben wird! Wird als Antwort markieren, wenn ich kann! – DukeOfMarmalade

+0

@Jim froh zu helfen. –

3

Die m_sLogPath Array enthält immer MAX_LOGPATH_LEN Zeichen. Unter der Annahme, dass MAX_LOGPATH_LEN eine Konstante größer als 0 ist, wird das Array nie wirklich leer sein.

Ich vermute, dass, was Sie wirklich überprüfen möchten, ist, ob die C-style Zeichenfolge in diesem Array leer ist. Wenn das der Fall ist, dann ist der einfachste Weg, es zu tun wäre:

#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. 
    } 
}