Repository 32bit  Forum
Repository 64bit  Wiki

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

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

Messaggioda Calzo » sab apr 18, 2009 16:01

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 apr 18, 2009 20:40, modificato 2 volte in totale.
Avatar utente
Calzo
Linux 2.0
Linux 2.0
 
Messaggi: 112
Iscritto il: sab ott 06, 2007 21:21
Località: MN
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE

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

Messaggioda Mario Vanoni » sab apr 18, 2009 16:19

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.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

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

Messaggioda Blallo » sab apr 18, 2009 16:37

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.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

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

Messaggioda Vito » sab apr 18, 2009 17:01

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
Vito
Staff
Staff
 
Messaggi: 4122
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

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

Messaggioda phobos3576 » sab apr 18, 2009 17:10

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;
}
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

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

Messaggioda Mario Vanoni » sab apr 18, 2009 17:21

#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.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

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

Messaggioda 414N » sab apr 18, 2009 17:31

Hai provato togliendo il # davanti alla x?
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2877
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

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

Messaggioda Calzo » sab apr 18, 2009 20:14

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
Calzo
Linux 2.0
Linux 2.0
 
Messaggi: 112
Iscritto il: sab ott 06, 2007 21:21
Località: MN
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE

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

Messaggioda Vito » sab apr 18, 2009 20:32

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]
Avatar utente
Vito
Staff
Staff
 
Messaggi: 4122
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti