Pergunta

Eu tenho uma string em C ++ do tipo const char* passado como argumento para strlen, mas ele retorna vazio.

ele vai como

strlen(astruct.string);

Obrigado ..

EDIT: Fiz alguns testes,

strlen("test");

ainda dá vazio .. porquê?

EDIT: Aqui está a imagem http://img14.imageshack.us/img14/1808/strlen.png

Desculpe por ser claro anteriormente. Formatação não estava funcionando muito bem. De qualquer forma, a confusão foi resolvido por ambos Evan Teran e Vlad Romascanu. Também dê uma olhada resposta de Brian R. Bondy.

Graças. Sinta-se livre para fechar.

Foi útil?

Solução

No que se refere à sua captura de tela:. O depurador está exibindo <void> para strlen(...) quando na verdade ele deve exibir um erro

Você não pode chamar métodos e exibir seus resultados no relógio depurador. O depurador exibirá apenas variáveis ??e dados existentes. Ele não pode invocar métodos arbitrários na demanda desde os métodos podem alterar o estado do programa que está sendo depurado de maneiras que não foram previstos nem pelo autor do código, nem pelo depurador.

O que você pode fazer é, no seu código, temporariamente adicionar:

size_t tmp_len = strlen(struc.string);

seguida, compilar e adicionar tmp_len para o relógio.

Outras dicas

Você está confuso com o depurador de baixa qualidade de visual studio 6.0. Não confie nisso. Ele provavelmente não poderia obter o valor de retorno devido a inlining ou algo similar.

Imprimir o valor para obter o valor real.

EDIT: Além disso, com seu exemplo, parece que você não pode estar armazenando o resultado de strlen de qualquer maneira. Isso também pode ser uma razão pela qual o depurador não está vendo o valor de retorno. É inteiramente possível que o compilador decidiu que ele não precisa para realmente executar o strlen se você não estiver usando o valor.

NOTA: neste momento não há nenhuma desculpa real para ainda usando VC ++ 6.0. É um compilador antiga e IDE que é um compilador embaraçosamente pobre c ++. As versões mais recentes do visual c ++ compilador é livre (sem a IDE), usá-los.

strlen não é do tipo de retorno void, é seu depurador que não está dando a mensagem certa.

Por seu debbuger está mostrando vazio?

A implementação de strlen que você está usando é provavelmente enrolado em um #define strlen someothername_strlen.

O depurador provavelmente não suporta #define corretamente ou alguns outros modificadores sobre a função.

Você vai ter que fazer algo como Ilen = strlen ( "test"), em seguida, verifique Ilen em seu relógio.

Normalmente, você pode chamar funções em seu relógio. Por exemplo tentar definir a seguinte função, em seguida, chamá-lo no seu relógio:

int testFunc(char*)
{
  return 5;
}

Você provavelmente irá obter 5 em seu relógio como resultado.

retornos STRLEN um inteiro, então eu suponho que você quer dizer que retorna "0".

Além disso, a maneira que você especifique o tipo de dados, eu não posso bastante dizer se é um const char * ou const char **. Se ele é o último, então você precisa se certificar de que você está dereferencing o ** a um único *.

Meu palpite é que a seqüência começa com um byte nulo, razão pela qual ele está retornando 0.

Em C ++, funções sempre retornam um valor do tipo tenham sido declarados retorno. Desde a declaração da função strlen é algo como isto:

size_t strlen(const char *);

A única coisa que pode possivelmente retorno é um size_t. O compilador usa esta informação em tempo de compilação para determinar como lidar com o valor de retorno quando você chamar a função. O ponto aqui é que se a função strlen é declarado como acima, não pode decidir voltar void por vezes, e um valor do tipo size_t outras vezes.

Esta é geralmente uma característica de linguagens de tipagem estática, como C ++. Em linguagens de tipagem dinâmica (Perl, Python, Ruby, PHP, etc) uma função pode decidir devolver um valor de qualquer tipo cada vez que ele é chamado.

Não pode retornar void. Vazio é a falta de um valor de retorno, então você não pode, err, devolvê-lo.

Como você verificar se há qualquer maneira vazio? Vazio não é um valor. Por favor, demonstrar como você está ficando vazio. É tempo de compilação ou tempo de execução?

Se você de fato tem um sistema onde strlen é declarado com um tipo void retorno, correr tão rápido quanto você pode em outra direção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top