C++ Verificare che in un vettore di char ci siano solo cifre

di il
10 risposte

C++ Verificare che in un vettore di char ci siano solo cifre

Scrivere una funzione che verifichi se in
char dato[8]
, completamente caricato con una stringa, sono presenti solo cifre.
char cifre[10];
	strcpy(cifre,"0123456789");
	char dato[8];
	strcpy(dato,"12345g78");
	if(    for(int i=0; i<8; i++){
		for(int j=0; j<10; j++){
			...
La mia idea era mettere come condizione dell'if il fatto che ogni dato deve essere uguale ad un elemento cifre[j].

Però mi sembra macchinosa e poco efficace (e non saprei come scriverla).
Mi potreste dare un consiglio/hint su come fare?

10 Risposte

  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    Devi solo controllare che il valore di ogni elemento del vettore rientri tra quelli dei valori ascii dei caratteri 0 e 9
  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    @stpy98: stai sbagliato l'approccio perchè non stai suddividendo il problema in sottoproblemi.
    Indipendentemente dall'implementazione devi ragionare a blocchi: la funzione che stai costruendo
    int isAllDigits(char *code,int len)
    può fare tutto lei oppure più semplicemente può appoggiarsi ad un'altra funzione, es.:
    int isDigit(char c)
    che ti ritorna 1/0 a seconda che il carattere passato sia o meno una cifra.
    Se ti concentri sulla sola isDigit() che lavora su singoli caratteri e la implementi correttamente poi la funzione isAllDigits() verrà implementata facilmente.

    Ora, per l'implementazione: la isDigit() potrebbe essere costituita da una semplice return:
    return((c>='0')&&(c<='9'));
    Nota: esiste anche la funzione di libreria isdigit() https://www.tutorialspoint.com/c_standard_library/c_function_isdigit.htm
    Invece la isAllDigits() diventa molto semplice:
    for(i=0;i<len;i++)
    	if(!isDigit(code[i])
    		return 0;
    return 1;
    Buono studio!
  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    ...semplicemente, come dice oregon:
    bool HasOnlyDigits(const char *s)
    {
    	while( *s )
    	{
    		if( *s < '0' || '9' < *s )
    			return false;
    
    		s++;
    	}
    
    	return true;
    }
  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    @Unqualunque ottimo, hai dato la pappa pronta
    Io credo che per il nostro amico stpy98 sia più utile capire il metodo piuttosto che avere la soluzione, vista purtroppo l'evidente confusione manifestata nel pezzo di codice che ci ha postato.
  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    Allora perdonatemi.
    Ma vuoi dire che da quelle quattro righe non riuscirà a leggere un metodo? Inoltre volevo mostrare che a volte, piuttosto che perdersi a cercare una funzione che faccia una certa cosa, conviene semplicemente fare quella cosa e basta.
  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    Unqualunque ha scritto:


    Allora perdonatemi.
    Tranquillo!

    Unqualunque ha scritto:


    Ma vuoi dire che da quelle quattro righe non riuscirà a leggere un metodo?
    Il punto è che l'OP probabilmente non ha neanche affrontato il discorso "puntatori" e probabilmente già il fatto che una stringa in C è un vettore di char con un terminatore di stringa potrebbe essere "destabilizzante" per lui (infatti dal titolo sembra che non si tratti neanche di una stringa terminata).

    Unqualunque ha scritto:


    Inoltre volevo mostrare che a volte, piuttosto che perdersi a cercare una funzione che faccia una certa cosa, conviene semplicemente fare quella cosa e basta.
    Infatti ho fatto notare che esiste la funzione isdigit() ma solo dopo aver spiegato all'OP come crearsene una da solo.
  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    Allora, grazie a candaluar, non sapevo che esistesse questa funzione!

    Per il resto, grazie anche a Unqualunque, il codice l'ho capito, l'unica cosa che non riuscivo a scrivere era la condizione dell'if. Non riesco a capire la scrittura della condizione nel while. Cioè tu dici di andare avanti tra i valori nel vettore char fino a quando finiscono, ma perchè basta scrivere while( *s) ?
  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    E inoltre devo mettere
    s=&dato[0]
    giusto?
  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    No, devi chiamare la funzione passando il nome del vettore di char

    bool result = HasOnlyDigits(dato);

    E devi fare attenzione che il vettore dato abbia il numero di elementi corretto (devi comprendere anche il terminatore della stringa).

    Probabilmente, come dice candaluar, non hai molta confidenza con vettori di char e puntatori e questo tipo di codice non era tra i migliori per iniziare ...
  • Re: C++ Verificare che in un vettore di char ci siano solo cifre

    stpy98 ha scritto:


    ... ma perchè basta scrivere while( *s ) ?
    Penso che abbiano ragione gli altri nel dire che dovresti prima prendere confidenza con l'uso dei puntatori. Comunque, s è il puntatore alla stringa di testo che è un vettore di caratteri. Una stringa di testo correttamente formattata deve sempre terminare con il carattere null che si scrive: '\0' e che vale 0 (zero). Dunque, se la stringa la scrivi tu, al suo termine dovrai aggiungere il carattere '\0', mentre se la stringa ti arriva da un generatore sicuro, terminerà sempre con il carattere '\0'. Ad esempio se tu scrivi:

    char *dato = "123";
    bool result = HasOnlyDigits(dato);

    sarai sicuro che il puntatore s riceverà un vettore di 4 caratteri, ovvero '1', '2', '3' e '\0' perché il compilatore costruirà la stringa di testo aggiungendo correttamente il terminatore nullo.

    Ora, perché basta scrivere: while( *s ) ? semplicemente perché while( statement ) valuta se statement è vero o falso.
    Come tu hai giustamente scritto prima, s = &dato[0] e ciò significa che *s == dato[0], *++s == dato[1], *++s == dato[2] e via dicendo.
    Ovvero, il puntatore s dereferenziato accede al carattere puntato. ora, quando *s rappresenterà l'ultimo carattere della stringa, ovvero il terminatore null, l'istruzione while lo valuterà come condizione falsa e terminerà il ciclo.
Devi accedere o registrarti per scrivere nel forum
10 risposte