2011-04-12 11 views
5

Perdón por molestar a todos, pero esto me está causando un poco de dolor. Aquí está el código:Luchando con sprintf ... ¿algo estúpido?

char buf[500]; 
sprintf(buf,"D:\\Important\\Calibration\\Results\\model_%i.xml",mEstimatingModelID); 

mEstimatingModelID es un entero, que ocupa actualmente el valor 0.

bastante simple, pero la depuración muestra que esto está sucediendo:

0x0795f630 "n\Results\model_0.xml" 

es decir, falta el comienzo de la cadena.

¿Alguna idea? Esto es simple, pero no puedo resolverlo.

Gracias!

+2

¿Seguro que no es el depurador engañando? Pruebe una versión de depuración con optimizaciones desactivadas o, más fácil, imprima el valor de 'buf'. –

+2

¿Cuándo está examinando el resultado: en esta función, o en algún momento después? No está devolviendo un puntero a "buf" de esta función, ¿verdad? Probablemente sepa esto, pero no puede devolver un puntero a una variable basada en pila de una función; la variable se convierte en basura tan pronto como la función retorna. –

+2

Funciona de forma independiente en Ideone - http://www.ideone.com/wJJ6o, parece que su depurador está funcionando. –

Respuesta

3

En un esfuerzo por hacer de ésta una respuesta general real: He aquí una lista de los errores similares:

  • nunca confía en lo que se ve en modo de lanzamiento, las variables sobre todo locales que han sido asignados de la memoria de pila. Las variables estáticas que existen en los datos del montón son casi las únicas que generalmente serán correctas, pero incluso así, no confíe en ellas. (Cuál fue el caso para el usuario anterior) Según mi experiencia, las versiones más recientes de VS tienen datos de modo de lanzamiento menos confiables (probablemente b/c optimizan mucho más en versión, o tal vez es de 64 bits o lo que sea)

  • Siempre verifique que está examinando la variable en la función correcta. Es muy fácil tener una variable llamada "buf" en una función más alta que tiene un poco de basura no inicializada. Esto se confundiría fácilmente con la misma variable nombrada en la función/subrutina inferior.

  • Siempre es una buena idea comprobar si hay desbordamientos de búfer. Si alguna vez usa un% s en su sprintf, podría obtener un desbordamiento del búfer.

  • Compruebe sus tipos. sprintf es bastante adaptable y usted puede conseguir fácilmente un no estrellarse, pero extraña consecuencia pasando un puntero de cadena cuando se espera un int etc.

+0

También puede agregar que 'snprintf()' puede evitar problemas de desbordamiento de búfer, aunque la versión proporcionada por MS no cumple totalmente con el estándar C99 y no garantiza una cadena terminada en nulo (por razones que MS conoce mejor). –

+1

+1 para los que no confían en lo que se ve en el modo de lanzamiento en el depurador. – Xeo