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

.
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

.
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
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.
@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!
