Domanda

Ho una stringa in C ++ di tipo const char* passata come argomento a strlen, ma restituisce nulla.

va come

strlen(astruct.string);

Grazie ..

EDIT: Ha fatto qualche controllo,

strlen("test");

dà ancora vuoto .. perché?

EDIT: Ecco l'immagine http://img14.imageshack.us/img14/1808/strlen.png

Ci scusiamo per il poco chiaro in precedenza. La formattazione non funzionava abbastanza bene. Comunque, la confusione è stato risolto sia Evan Teran e Vlad Romascanu. Anche dare un'occhiata alla risposta di Brian R. Bondy.

Grazie. Sentitevi liberi di chiudere.

È stato utile?

Soluzione

In riferimento alla schermata: il debugger visualizza <void> per strlen(...) quando in realtà dovrebbe visualizzare un errore

.

Non è possibile chiamare i metodi e visualizzare i risultati nell'orologio debugger. Il debugger mostrerà solo le variabili e dati esistenti. Non può richiamare i metodi arbitrari su richiesta dal momento che i metodi possono alterare lo stato del programma in fase di debug in modi che non siano stati anticipati né dal autore del codice, né dal debugger.

Che cosa si può fare è, nel codice, temporaneamente aggiungere:

size_t tmp_len = strlen(struc.string);

quindi compilare e aggiungere tmp_len per l'orologio.

Altri suggerimenti

Si sono confusi dal debugger scadente di Visual Studio 6.0. Non fare affidamento su questo. E 'probabile che non ha potuto ottenere il valore di ritorno a causa di inline o qualcosa di simile.

Stampa il valore fuori per ottenere il valore reale.

EDIT: Inoltre, dal vostro esempio, sembra che non si può essere memorizzare il risultato di strlen comunque. Questo può anche essere un motivo per cui il debugger non è vedere il valore di ritorno. E 'del tutto possibile che il compilatore ha deciso che non ha bisogno di eseguire effettivamente lo strlen se non si utilizza il valore.

NOTA: a questo punto non v'è alcuna reale giustificazione per ancora utilizzando VC ++ 6.0. Si tratta di un antico compilatore e IDE che è un imbarazzante scarsa compilatore C ++. Le versioni più recenti del compilatore Visual C ++ sono liberi (senza l'IDE), usarli.

strlen non è di tipo di ritorno vuoto, è il tuo debugger che non sta dando il messaggio giusto.

Perché il vostro debbuger sta mostrando vuoto?

L'attuazione di strlen che si sta utilizzando è probabilmente avvolto intorno a un # define strlen someothername_strlen.

Il debugger probabilmente non supporta #define correttamente o alcuni altri modificatori sulla funzione.

Si dovrà fare qualcosa di simile Ilen = strlen ( "test") quindi controllare iLen nel vostro orologio.

Normalmente è possibile richiamare le funzioni nel vostro orologio. Per esempio cercare di definire la funzione segue quindi chiamare nel vostro orologio:

int testFunc(char*)
{
  return 5;
}

Probabilmente otterrete 5 nel vostro orologio come un risultato.

strlen restituisce un intero, quindi suppongo che voi dire restituisce "0".

Inoltre, il modo in cui si specifica il tipo di dati, non posso non del tutto a capire se si tratta di un const char * o const char **. Se si tratta di quest'ultimo, quindi è necessario assicurarsi che si sta dereferencing il ** a una singola *.

La mia ipotesi è che la stringa inizia con un byte nullo, ed è per questo che è il ritorno 0.

In C ++, le funzioni restituiscono sempre un valore del tipo in cui sono dichiarate a tornare. Dal momento che la dichiarazione di funzione strlen simile a questa:

size_t strlen(const char *);

l'unica cosa che possono eventualmente di ritorno è un size_t. Il compilatore utilizza queste informazioni al momento della compilazione per determinare come gestire il valore restituito quando si chiama la funzione. Il punto qui è che se la funzione strlen viene dichiarata come sopra, non si può decidere di tornare void volte e un valore di tipo size_t altri tempi.

Questa è generalmente una caratteristica delle lingue staticamente tipizzati come il C ++. In linguaggi dinamicamente tipizzati (Perl, Python, Ruby, PHP, ecc) una funzione può decidere di restituire un valore di qualsiasi tipo ogni volta che viene chiamato.

Non può restituire void. Vuoto è la mancanza di un valore di ritorno, in modo da non può, err, restituirlo.

Come si fa a controllare per nulla in ogni caso? Vuoto non è un valore. Si prega di dimostrare come si stanno ottenendo nulla. E 'tempo di compilazione o eseguire volta?

Se si fa in realtà hanno un sistema in cui strlen viene dichiarato con un tipo di ritorno void, correre il più velocemente possibile in direzione opposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top