2012-10-02 15 views
12

Si prega di prendere il seguente:Definire una stringa su più righe

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); 

Vorrei essere in grado di creare questa stringa su più righe, per la facilità di risoluzione dei problemi e la modifica. Tuttavia, quando utilizzo il comando \, il mio output è separato da ciò che sembra essere tabs?

Esempio:

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

produce una potenza di:

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

Tutte le idee? È solo un approccio scorretto per provare a suddividere una stringa su più righe di codice?

+0

Non dovrebbe usare '\ R' in' printf' –

+0

Perché sulla terra non? – Mawg

+0

Possibile duplicato di [Come dividere una stringa letterale su più righe in C/Objective-C?] (Http://stackoverflow.com/questions/797318/how-to-split-a-string-literal-across-multiple -lines-in-c-obiettivo-c) –

risposta

19

La continuazione di nuova riga tiene conto di qualsiasi spazio bianco all'interno del codice.

È possibile usufruire di concatenazione di stringhe letterali per una migliore leggibilità:

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

Utilizzando \ avrete bisogno per iniziare la continuazione della stringa in colonna 0:

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

Fronte schiaffeggiato. L'auto-tabulazione mi ha fatto entrare! Grazie per avermelo fatto notare, questo era davvero il problema. – Nanomurf

4

Anche questo sarebbe solo di lavoro così:

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

Grazie, non mi ero reso conto che anche questo funzionava. – Nanomurf

8

anche se questo m sembro pedante, sono stato morso abbastanza volte nel mondo reale per avere i seguenti problemi con le altre due risposte postate.

  • le due risposte postato trascurare di dare spazi tra le parole che uniscono le stringhe letterali separati (evidenti, dopo il primo test).

  • Se la stringa è davvero lunga, utilizzare snprintf() invece - è leggermente goffo, ma dice a chiunque rivedere il codice che siete a conoscenza di pericoli comuni di manutenzione del codice.

  • Se la stringa contiene %, verrà visualizzato un avviso del compilatore (valido) o errori di segmentazione casuale (non valido). In modo da utilizzare "%s" o, forse in questo caso, solo strcpy(). (In due mesi, un collega potrebbe facilmente aggiungere 99.9% al messaggio.)

  • L'uso di memset(), che vedo spesso, è solo cargo -cult programmazione . Sì, in casi particolari ne è necessario uno, ma usando invia sempre il messaggio sbagliato.

  • E infine, perché qualcuno dovrebbe usare &buffer[0] quando solo buffer farebbe?

Quindi, per riassumere, il codice dovrebbe forse leggere:

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

Questi sono tutti ottimi punti. Grazie per aver dedicato del tempo per realizzarli. Il codice sopra riportato è davvero solo un esempio di ciò che sto trattando, ma tutti i punti che hai elencato qui sono molto validi. E per rispondere alla tua ultima domanda: non sono un programmatore elegante, così spesso faccio affidamento sulla forza bruta. > Nanomurf

+0

@JosephQuinsey Non pensavo fosse necessario, anche se hai attirato la mia attenzione sulle mancanze della mia risposta. L'obiettivo su questo sito è una buona domanda e risposta, e ognuno deve sostenerlo nel merito, anche se ciò significa sintetizzare parti utili di altre risposte, e spesso non citare @ altri utenti. Detto questo, anche l'input del tuo commento mi è utile, e mi scuso. – pb2q

+0

@ pb2q: Grazie per la tua risposta molto aggraziata. –

Problemi correlati