Pagina 1 di 1

[C] Definire stringa basata su un'altra define [RISOLTO]

Inviato: sab 18 apr 2009, 17:01
da Calzo
Ciao a tutti.
Mi stavo chiedendo se è possibile creare una stringa (costante) partendo da una macro che definisca un numero. Mi spiego meglio (spero) con un esempio: supponiamo che debba creare una stringa di 10 caratteri. Vorrei che la scanf non acquisica più di 10 caratteri e per questo vorrei definire (non creare) una stringa costante pari a "%10s" per questo esempio. Io ho pensato subito una cosa del genere:

Codice: Seleziona tutto

#include <stdio.h>
#define N	10
#define stringa(x)	"%"#x"s"

int main() {
	char c[N];        // per ora questo non serve, ma servirà poi ;)
	puts(stringa(N));
	return 0;
}
Il codice postato è solo per capire che stringa sto generando... e non genero nulla di buono :-k. puts() infatti restituisce "%Ns" e non "%10s"... e non ho altre idee

Non so se è chiaro il problema, ma avete un'idea di come fare ad ottenere una stringa da una macro senza usare funzioni C?

Grazie
bye

Re: C: Definire stringa basata su un'altra define

Inviato: sab 18 apr 2009, 17:19
da Mario Vanoni
Calzo ha scritto:Ciao a tutti.
Mi stavo chiedendo se è possibile creare una stringa (costante) partendo da una macro che definisca un numero. Mi spiego meglio (spero) con un esempio: supponiamo che debba creare una stringa di 10 caratteri. Vorrei che la scanf non acquisica più di 10 caratteri e per questo vorrei definire (non creare) una stringa costante pari a "%10s" per questo esempio. Io ho pensato subito una cosa del genere:

Codice: Seleziona tutto

#include <stdio.h>
#define N	10
#define stringa(x)	"%"#x"s"

int main() {
	char c[N];        // per ora questo non serve, ma servirà poi ;)
	puts(stringa(N));
	return 0;
}
Il codice postato è solo per capire che stringa sto generando... e non genero nulla di buono :-k. puts() infatti restituisce "%Ns" e non "%10s"... e non ho altre idee

Non so se è chiaro il problema, ma avete un'idea di come fare ad ottenere una stringa da una macro senza usare funzioni C?

Grazie
bye
char c[N]; /* e` un errore */
char c[N + 1]; /* sara` usabile */
ogni stringa deve avere un \0 quale terminatore.

Re: C: Definire stringa basata su un'altra define

Inviato: sab 18 apr 2009, 17:37
da Blallo
francamente non saprei...per ora mi viene in mente solo l'utilizzo di un ciclo (che tu non vuoi usare da quello che ho capito), magari un do-while.

Re: C: Definire stringa basata su un'altra define

Inviato: sab 18 apr 2009, 18:01
da Vito
Consiglio: Quando lavori su vettori e/o stringhe sovradimensionali sempre!

Re: C: Definire stringa basata su un'altra define

Inviato: sab 18 apr 2009, 18:10
da phobos3576
L'errore sta nel fatto che #x viene espanso in una stringa e non in un valore numerico.

Se chiamo stringa(N), allora #x viene espanso in "N".
Se chiamo stringa(Pippo), allora #x viene espanso in "Pippo".

Una soluzione potrebbe essere allora:

Codice: Seleziona tutto

#include <stdio.h>

#define  N              10
#define  stringa(x)     "%" #x "s"
#define  setvalue(val)  stringa(val)

int main(void)
{
   puts(setvalue(N));

   return 0;
}

Re: C: Definire stringa basata su un'altra define

Inviato: sab 18 apr 2009, 18:21
da Mario Vanoni
#define stringa(x) "%"#x"s"
cosa dovrebbe significare?

printf("%#xs", ?, ?):
printf non conosce %#s
conosce # allegato a, A ecc. ma non %#s
per #x intendi un parametro oppure un unsigned integer x?

Rinuncio a capire.

Una stringa standard nei miei programmi
#define SCCSID "@(#)" __FILE__ " 30-Oct-2008/va compiled " __DATE__ " " __TIME__
viene usata attraverso
char *sccsid(void) { return (SCCSID); }
per identificare, con what(1), la versione dei programmi.

Re: C: Definire stringa basata su un'altra define

Inviato: sab 18 apr 2009, 18:31
da 414N
Hai provato togliendo il # davanti alla x?

Re: C: Definire stringa basata su un'altra define [RISOLTO]

Inviato: sab 18 apr 2009, 21:14
da Calzo
Scusate se rispondo solo ora.

Quello che volevo fare è esattamente quello che ha scritto phobos3576. Io insistevo sul volerlo fare solo con due define, ma effettivamente non avevo pensato che scomodandone una terza potevo sistemare tutto #-o

Ad ogni modo tutto questo mi serve per forzare una lettura fissa di caratteri dalla scanf(); qualche cosa di smile a questo:

Codice: Seleziona tutto

include <stdio.h>

#define STRBUF 10
#define str(x) "%"#x"s"
#define strv(x) str(x)

int main() {
   char c[STRBUF+1];
   
   scanf(strv(STRBUF), c);
   [...]
   puts(c);
   return 0;
}
L'unica cosa è che devo mettere STRBUF+1 (cosa che per altro suggeriva fin da subito Mario) nella definizione della stringa c, mentre avrei preferito porre un strv(STRBUF-1) nella scanf(), ma vedo che la stringa diventa "%10-1s" e quindi non va bene. Quindi userò la soluzione proposta a phobos che va benissimo per quello che devo fare. :thumbright:

@vito: purtroppo spesso ho i byte contati ;)

Grazie a tutti
bye

Re: C: Definire stringa basata su un'altra define [RISOLTO]

Inviato: sab 18 apr 2009, 21:32
da Vito
Addirittura?
Allora fai bene! :-D