Pregunta

Tengo una cadena en C ++ de tipo const char* pasa como argumento a strlen, pero regresa vacía.

va como

strlen(astruct.string);

Gracias ..

EDIT: Hizo algunas averiguaciones,

strlen("test");

sigue dando vacío .. ¿por qué?

EDIT: Aquí está la imagen http://img14.imageshack.us/img14/1808/strlen.png

Lo siento por ser claro con anterioridad. El formato no estaba funcionando bastante bien. De todos modos, la confusión se resolvió por tanto Evan Teran y Vlad Romascanu. También echa un vistazo a la respuesta de Brian R. Bondy.

Gracias. Siéntase libre de cerrar.

¿Fue útil?

Solución

En referencia a la captura de pantalla: el depurador está mostrando <void> para strlen(...) cuando en realidad debería mostrar un error

.

No se puede llamar a los métodos y mostrar sus resultados en el reloj depurador. El depurador sólo mostrará las variables y los datos existentes. No puede invocar métodos arbitrarios en la demanda ya que los métodos pueden alterar el estado del programa que se está depurando en formas que no fueron detectados por el autor del código ni por el depurador.

Lo que puede hacer es, en su código, de manera temporal añadir:

size_t tmp_len = strlen(struc.string);

a continuación, compilar, y añadir tmp_len al reloj.

Otros consejos

está confundido por el depurador de Visual Studio chungo 6.0. No confíe en esto. Es probable que no se pudo obtener el valor de retorno debido a la expansión en línea o algo similar.

Imprimir el valor cabo para obtener el valor real.

EDIT: Además, de su ejemplo, parece que puede que no esté almacenando el resultado de strlen de todos modos. Esto también puede ser una razón por la que el depurador no está viendo el valor de retorno. Es muy posible que el compilador decidió que no necesita para ejecutar realmente el strlen si no está utilizando el valor.

NOTA: en este momento no hay ninguna excusa real para Todavía utilizando VC ++ 6.0. Es un antiguo compilador e IDE que es un vergonzosamente pobre compilador de C ++. Las versiones más recientes del compilador de Visual C ++ están libres (sin el IDE), usarlos.

strlen no es del tipo de retorno vacío, es su depurador que no está dando el mensaje correcto.

¿Por qué su Debbuger está mostrando vacío?

La implementación de strlen que está utilizando es, probablemente, envuelto alrededor de un #define strlen someothername_strlen.

El depurador probablemente no es compatible con # define correctamente o algunos otros modificadores de la función.

Usted tendrá que hacer algo como ILEN = strlen ( "test") a continuación, comprobar ILEN en su reloj.

Normalmente se puede llamar a las funciones de su reloj. Por ejemplo tratar de definir la siguiente función a continuación, lo haga en su reloj:

int testFunc(char*)
{
  return 5;
}

Es probable que obtener 5 en su reloj como resultado.

strlen devuelve un entero, por lo que supongo que quiere decir que devuelve "0".

Además, la forma en que se especifica el tipo de datos, no puedo bastante decir si es un char * const o const char **. Si es esto último, entonces usted necesita para asegurarse de que está dereferencing el ** a un solo *.

Mi conjetura es que la cadena comienza con un byte nulo, por lo que está devolviendo un 0.

En C ++, funciones siempre devuelven un valor del tipo en que se declaran para volver. Desde la declaración de la función strlen es como la siguiente:

size_t strlen(const char *);

lo único que puede posiblemente de retorno es un size_t. El compilador utiliza esta información en tiempo de compilación para determinar cómo manejar el valor de retorno cuando se llama a la función. El punto aquí es que si la función strlen se declara que el anterior, no puede decidir volver void veces y un valor de tipo size_t otros momentos.

Esto es generalmente una característica de las lenguas tipos estáticos como C ++. En los lenguajes de tipos dinámicos (Perl, Python, Ruby, PHP, etc.) una función puede decidir devolver un valor de cualquier tipo cada vez que se llama.

No se puede volver vacío. Vacío es la falta de un valor de retorno, por lo que no puede, err, devolverlo.

¿Cómo se comprueba por vacío de todos modos? Vacío no es un valor. Por favor, demostrar cómo se está recibiendo vacío. ¿Es tiempo de compilación o de tiempo de ejecución?

Si lo hace, de hecho, tiene un sistema donde strlen se declara con un tipo de retorno void, correr tan rápido como sea posible en la otra dirección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top