2012-10-02 27 views
12

Sigue los siguientes:La definición de una cadena a través de múltiples líneas

char buffer[512]; 

memset(buffer, 0, sizeof(buffer)); 
sprintf(&buffer[0],"This Is The Longest String In the World that in text goes on and.."); 

printf("Buffer:%s\r\n",buffer); 

me gustaría ser capaz de crear esta cadena a través de múltiples líneas, para facilitar la solución de problemas y la edición. Sin embargo, cuando uso el comando \ mi salida está separada por lo que parecen ser pestañas?

Ejemplo:

sprintf(&buffer[0],"This Is The\ 
    Longest String In the World\ 
    that in text goes on and.."); 

produce una salida de:

Buffer:This Is The  Longest String In the World  that in text goes on and.. 

Cualquier ideas? ¿Es solo un enfoque incorrecto para tratar de dividir una cadena en múltiples líneas de código?

+0

Usted no debe usar '\ R' en' printf' –

+0

¿Por qué diablos no? – Mawg

+0

Posible duplicado de [¿Cómo dividir un literal de cadena en varias líneas en C/Objective-C?] (Http://stackoverflow.com/questions/797318/how-to-split-a-string-literal-across-multiple -lines-in-c-objective-c) –

Respuesta

19

La continuación de nueva línea tiene en cuenta cualquier espacio en blanco dentro del código.

Usted puede tomar ventaja de concatenación de cadena literal para una mejor legibilidad:

sprintf(buffer, "This Is The " 
       "Longest String In the World " 
       "that in text goes on and.."); 

Usando \ que necesita para comenzar la continuación de la cadena en la columna 0:

sprintf(buffer, "This Is The \ 
Longest String In the World \ 
that in text goes on and.."); 
+1

Frente abofeteado. Auto-tabbing me ha ayudado! Gracias por señalar esto, este fue de hecho el problema. – Nanomurf

4

Esto también lo haría solo funciona también:

char buffer[512]; 
sprintf(&buffer[0], "This is the longest string" 
     "in the world that in text" 
     "goes on and on and on and on ...."); 
printf("%s\n", buffer); 
+0

Gracias, no me había dado cuenta de que esto funcionaría también. – Nanomurf

8

Aunque este m Puede parecer pedante, me han mordido suficientes veces en el mundo real como para tener los siguientes problemas con las otras dos respuestas publicadas.

  • Las dos respuestas publicadas negligencia para dar espacios entre las palabras que unen los literales de cadena separados (obvias, después de la primera prueba).

  • Si la cadena es muy larga, utilizar snprintf() lugar - es ligeramente torpe, pero le dice a alguien revisión de su código que son conscientes de los peligros comunes en el mantenimiento del código.

  • Si la cadena pasa a contener %, obtendrá un compilador de advertencia (bueno) o de segmento al azar (malo). A fin de utilizar "%s" o, tal vez en este caso, simplemente strcpy(). (En dos meses, un compañero de trabajo podría fácilmente añadir 99.9% al mensaje.)

  • El uso de memset(), la que veo a menudo, es sólo de carga -cult programación. Sí, en casos especiales, uno lo necesita, pero al usar , todo el tiempo envía un mensaje incorrecto.

  • Y, por último, ¿por qué alguien usaría &buffer[0] cuando solo buffer haría?

Entonces, para resumir, el código debe quizás lea:

char buffer[512]; 
snprintf(buffer, sizeof buffer, "%s", 
    "This is The Longest String " 
    "In the World that in text " 
    "goes on and on and on and on ...."); 
printf("Buffer:%s\r\n", buffer); 
+1

Estos son todos puntos muy buenos. Gracias por tomarse el tiempo para hacerlos. El código anterior es realmente solo un ejemplo de lo que estoy tratando, pero todos los puntos que has enumerado aquí son muy válidos. Y para responder a su última pregunta: no soy un programador elegante, por lo que a menudo confío en la fuerza bruta. ><¡Agradezco los comentarios! – Nanomurf

+0

@JosephQuinsey No pensé que fuera necesario, a pesar de que llamó mi atención sobre las deficiencias en mi respuesta. El objetivo en este sitio es buenas preguntas y respuestas, y cada una debe defenderse sobre la base de los méritos, incluso si eso significa sintetizar piezas útiles de otras respuestas, y a menudo no cito a otros usuarios. Habiendo dicho eso, la información de su comentario también me es útil, y me disculpo. – pb2q

+0

@ pb2q: Gracias por su respuesta muy elegante. –

Cuestiones relacionadas