Newsgroup: it.comp.lang.c
Titolo: Domanda su vettore di caratteri

Ciao a tutti, mi servirebbe gentilmente sapere come far distinguere ad
un programma dei numeri dai normali caratteri all'interno di un vettore
di caratteri.
es:
il vettore di caratteri è inizializzato con la stringa "oggi e' il 4
maggio"
e devo far sapere tramite apposita istruzione (o più istruzioni) che
il carattere 4 in realtà è un numero intero e in un certo senso deve
essere riconosciuto diversamente.
Avevo pensato ad una istruzione if che in pratica diceva che se
stringa[j]==4 (giusto per rendere l'idea) ha incontrato 4 lungo il suo
ciclo deve prenderlo e fargli fare un'altra cosa.
Non riesco perchè ogni volta mi riconosce il 4 come un carattere e non
come un numero.
Voi cosa potete dirmi a riguardo?
Spero di essere stato chiaro.

 Spero di essere stato chiaro.
Insommma ....
se vuoi vedere se un carattere e' il carattere 4 allora il test
sara' stringa[j] == '4' perche'   '4' e' il carattere 4.
Per vedere se un generico carattere e' un numero puoi usare la
funzione isdigit() definita in ctype.h
quindi, ad esempio, per trovare il punto di una stringa
in cui compare il primo numero
#include<ctype.h>
char *p;
p=stringa;
while (*p && !isdigit(*p)) p++;
quando esce dal ciclo p punta o alla fine di stringa (quindi ad un
terminatore 0) se non ha trovato nessun numero oppure al primo
numero che compare nella stringa di caratteri.
la stessa cosa la puoi ottenere usando la funzione strpbrk() definita
in string.h  e che serve a trovare in una stringa data la prima occorrenza
di un certo insieme di caratteri:
#include<string.h>
char *p;
p = strpbrk(stringa,"0123456789");
poi puoi usare la funzione strspn() sempre di string.h per
vedere (se ti serve) quanto e' lunga la sequenza di caratteri
numerici:
int quanti;
quanti = strspn(p, "0123456789");
a quel punto sai che la prima occorrenza di caratteri numerici
in stringa parte dal carattere puntato da p e arriva al carattere puntato
da p+(quanti-1) (se *p!=0, naturalmente).
Nel caso tu voglia usare queste funzioni di ctype.h o string.h vai
prima a leggerti le indicazioni dettagliate per il loro uso.
ciao,
g.

Grazie vanvera per la risposta, comunque devo risolvere l'esercizio
senza usare alcuna libreria standard e quindi devo crearmi tutto il
codice da me.
Per risolvere il mio problema stavo pensando di creare un vettore di
caratteri inizializzato con 0,1,2,3,4,5,6,7,8,9 e metterlo in un ciclo
(quello che in pratica dovrebbe fare la funzione strpbrk) anche se
l'esito non credo sia positivo per quello che devo fare. Perchè con
una semplice:
if(testo[i]==0 || testo[i]==1 || testo[i]==2.........)
i numeri 0,1,2,ecc me li vede come dei normali caratteri. (assumendo
ovviamente che il vettore in questione è di tipo char)
Spero comunque che non ci siano problemi a passare un numero intero di
tipo char ad un elemento di un vettore di numeri interi.

s-mik wrote:

come ti ho gia' detto nell'altro messaggio
il confronto
testo[i]==7 va a vedere se il codice binario del carattere in
posizione i e' uguale a 7 (sbagliato!)
invece il confronto
testo[i]=='7' va a vedere se il codice binario del carattere
in posizione i e' uguale al codice binario del carattere '7'
(che non e' 7....) e questo e' giusto.
(Guardati una tabella ASCII per chiarirti un attimo le idee
su come ogni carattere viene codificato con un apposito byte),
ciao,
g.

 
Prima di andare avanti, rifletti bene su cos'e' un carattere.
Per il C un char è un intero di (almeno) 8 bit. Normalmente un carattere 
viene rappresentato tramite il suo codice ASCII.
  Per facilitarti la vita, il compilatore ti permette di usare la 
notazione 'A' per indicare un carattere ma si tratta, comunque, di un 
numero (65 assumendo da qui' in poi di usare la codifica ASCII).
  Per controllare se la variabile c contiene il carattere '0' puoi 
scrivere indifferentemente:
   if (c == '0') ...
   if (c == 48 ) ...
   if (c == 0x30) ...
  Scrivere testo['0'] è perfettamente valido e corrisponde a testo[48] 
(ossia il 49-esimo elemento dell'array testo).
  Una volta compreso questo, non dovrebbe essere difficile capire cos'e':
   if ( '0' <= c && c <= '9') z=t[c-'0']
  e, se capisci questo, il resto viene da se'.
  R.D.

Grazie ad entrambi per avermi chiarito le idee. Ora sono riuscito a far
distinguere i pseudo-numeri dai caratteri. Comunque, forse a causa del
compilatore che uso ma non credo (Dev-C++) quando mando in output il
programma mi visualizza tutto correttamente ma nella stringa dei numeri
appaiono affianco dei segni incomprensibili.
Es:
se stringa_titolo contiene: "oggi è lunedì 8 maggio"
in output viene:
stringa_caratteri "oggi è lunedì maggio"
stringa_numeri "8 )/($%" (giusto per rendere l'idea)
e mi sono anche accorto che si diminuisco la dimensione del vettore
(all'inizio vuoto) dei numeri, per esempio da 100 a 10, il problema dei
segni incomprensibili sparisce. Non riesco assolutamente a chiarire il
perchè si verifichi questa cosa.

s-mik wrote:

Senza vedere il codice e' un po' difficile capire dove hai
sbagliato...
Comunque sembra che tu ti sia dimenticato di mettere il terminatore
0 di stringa dopo i numeri nella stringa dei numeri.
Le stringhe in C sono rappresentate come array di caratteri.
La fine della stringa
viene segnalata da un carattere il cui valore come byte e' zero.
g.