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

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Calzo
Linux 1.x
Linux 1.x
Messaggi: 112
Iscritto il: sab 6 ott 2007, 22:21
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE
Località: MN

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

Messaggio 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
Ultima modifica di Calzo il sab 18 apr 2009, 21:40, modificato 2 volte in totale.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

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

Messaggio 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.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

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

Messaggio 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.

Avatar utente
Vito
Staff
Staff
Messaggi: 4182
Iscritto il: mar 5 dic 2006, 17:28
Nome Cognome: Vito
Desktop: MacOS
Località: Monaco (DE)
Contatta:

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

Messaggio da Vito »

Consiglio: Quando lavori su vettori e/o stringhe sovradimensionali sempre!
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

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

Messaggio 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;
}

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

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

Messaggio 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.

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2924
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

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

Messaggio da 414N »

Hai provato togliendo il # davanti alla x?

Avatar utente
Calzo
Linux 1.x
Linux 1.x
Messaggi: 112
Iscritto il: sab 6 ott 2007, 22:21
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE
Località: MN

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

Messaggio 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

Avatar utente
Vito
Staff
Staff
Messaggi: 4182
Iscritto il: mar 5 dic 2006, 17:28
Nome Cognome: Vito
Desktop: MacOS
Località: Monaco (DE)
Contatta:

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

Messaggio da Vito »

Addirittura?
Allora fai bene! :-D
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]

Rispondi