Domanda Convertire numero telefonico in altro formato

  • Autore discussione Deleted member 287194
  • Data d'inizio
D

Deleted member 287194

Salve, il mio testo chiede di scrivere un programma che chieda all'utente di inserire un numero telefonico nella forma (xxx) xxx-xxxx e successivamente di stamparlo nella forma xxx.xxx.xxxx;
Ad esempio: INSERISCI NUMERO: (404) 817-6900
NUMERO INSERITO: 404.817.6900

Il programma da me scritto è il seguente:
#include <stdio.h> int main (void) { int in, cen, fin; printf ("Inserisci il numero di telefono nella forma (xxx) xxx-xxxx: "); scanf("(%d)%d-%d", &in, &cen, &fin); printf ("Il numero è: %d.%d.%d\n", in, cen, fin); return 0; }

Tutta via il primo numero (quello tra parentesi) me lo da corretto, gli altre due mi ridà numeri a caso.
Non capisco se centra come ho formattato lo scanf, come ho scritto il printf o come inserisco io gli input (io scrivo ciò che mi dice la traccia, con le parentesi, gli spazi e la tratteggiatura).
 
🤷🏻‍♀️ non mi sembra dia problemi
 

Allegati

  • IMG_2738.jpeg
    IMG_2738.jpeg
    2.5 MB · Visualizzazioni: 3
  • Mi piace
Reazioni: JunkCoder
Ultima modifica:
Manca lo spazio dopo la parentesi nella chiamata a scanf.
Non credo sia quello perché io ho provato sia con che senza e funziona lo stesso

Edit: certo io ho usato tipo un compilatore online per fare un test quindi boh magari non è troppo realistico? Però mi sembra strano di solito funziona bene. Ho provato con lo spazio dopo la parentesi e senza e con lo spazio in input e senza e anche mixati e ha funzionato la
 
A occhio mi sembra corretto.

Ciò che mi crea qualche dubbio è l'utilizzo dei numeri interi invece che delle stringhe. Se una delle parti inizia con 0, lo vedresti troncato.
 
  • Mi piace
Reazioni: Claa46
L’unica cosa che mi viene in mente è che fai qualcosa di sbagliato quando metti l’input però mi sembra strano cioè è abbastanza semplice 🤔 mistero
Se scopri il motivo fa sapere 🤣
 
Io proprio non capisco cosa c'è di sbagliato...
 

Allegati

  • Screenshot 2023-05-25 alle 20.47.23.png
    Screenshot 2023-05-25 alle 20.47.23.png
    379.9 KB · Visualizzazioni: 4
Io lo avrei risolto alla vecchia maniera, facendo il parsing a mano. Con la scanf è garantito che prima o poi ci si fa male.
C:
#include <stdio.h>
#define MAXLEN 32

int main(void) {
    char input[MAXLEN];
    printf("Inserisci il numero: ");
    fgets(input, MAXLEN, stdin);

    char output[MAXLEN];
    for (int i = 0, k = 0; input[i] != '\0'; i++) {
        if ('0' > input[i] || input[i] > '9')
            continue;

        output[k++] = input[i];
        if (k == 3 || k == 7)
            output[k++] = '.';
    }

    printf("Numero inserito: %s\n", output);
    return 0;
}

@pexeq: hai scritto (404) (817-6900) invece di (404) 817-6900. Le parentesi in più non vanno bene nel tuo programma.
 
Io lo avrei risolto alla vecchia maniera, facendo il parsing a mano. Con la scanf è garantito che prima o poi ci si fa male.
C:
#include <stdio.h>
#define MAXLEN 32

int main(void) {
    char input[MAXLEN];
    printf("Inserisci il numero: ");
    fgets(input, MAXLEN, stdin);

    char output[MAXLEN];
    for (int i = 0, k = 0; input[i] != '\0'; i++) {
        if ('0' > input[i] || input[i] > '9')
            continue;

        output[k++] = input[i];
        if (k == 3 || k == 7)
            output[k++] = '.';
    }

    printf("Numero inserito: %s\n", output);
    return 0;
}
Sono nuovo... non conosco questi metodi
 
Io proprio non capisco cosa c'è di sbagliato...
Hai provato senza le tonde attorno ai numeri ? Intendo vedo che hai messo in input (404) (113-123) prova (404) 123-123

Edit: o hai cambiato foto allegata o mi drogo 🤣 comunque boh non vedo nulla di strano aiuto ahah
Messaggio unito automaticamente:

Io lo avrei risolto alla vecchia maniera, facendo il parsing a mano. Con la scanf è garantito che prima o poi ci si fa male.
C:
#include <stdio.h>
#define MAXLEN 32

int main(void) {
    char input[MAXLEN];
    printf("Inserisci il numero: ");
    fgets(input, MAXLEN, stdin);

    char output[MAXLEN];
    for (int i = 0, k = 0; input[i] != '\0'; i++) {
        if ('0' > input[i] || input[i] > '9')
            continue;

        output[k++] = input[i];
        if (k == 3 || k == 7)
            output[k++] = '.';
    }

    printf("Numero inserito: %s\n", output);
    return 0;
}

@pexeq: hai scritto (404) (817-6900) invece di (404) 817-6900. Le parentesi in più non vanno bene nel tuo programma.
Visto che stava seguendo l’esempio di un manuale e sta studiando la base base mi sa che se lo vuoi far passare da quella versione a questa ti tocca spiegargli ogni passaggio sennò non capisce nulla
 
Io lo avrei risolto alla vecchia maniera, facendo il parsing a mano. Con la scanf è garantito che prima o poi ci si fa male.
C:
#include <stdio.h>
#define MAXLEN 32

int main(void) {
    char input[MAXLEN];
    printf("Inserisci il numero: ");
    fgets(input, MAXLEN, stdin);

    char output[MAXLEN];
    for (int i = 0, k = 0; input[i] != '\0'; i++) {
        if ('0' > input[i] || input[i] > '9')
            continue;

        output[k++] = input[i];
        if (k == 3 || k == 7)
            output[k++] = '.';
    }

    printf("Numero inserito: %s\n", output);
    return 0;
}

@pexeq: hai scritto (404) (817-6900) invece di (404) 817-6900. Le parentesi in più non vanno bene nel tuo programma.
Si hai ragione, ho sostituito lo screen con quello corretto; ma anche in tal caso niente
Messaggio unito automaticamente:

Hai provato senza le tonde attorno ai numeri ? Intendo vedo che hai messo in input (404) (113-123) prova (404) 123-123

Edit: o hai cambiato foto allegata o mi drogo 🤣 comunque boh non vedo nulla di strano aiuto ahah
Messaggio unito automaticamente:


Visto che stava seguendo l’esempio di un manuale e sta studiando la base base mi sa che se lo vuoi far passare da quella versione a questa ti tocca spiegargli ogni passaggio sennò non capisce nulla
Hai ragione infatti, la foto l'ho cambiata ahahh; ma anche in tal caso niente;
Messaggio unito automaticamente:

Ho notato che in un compilatore online e se copio il numero da una parte e lo incollo sul mio di compilatore, il codice funziona perfettamente;
Ma dalla mia tastiera direttamente sul compilatore non va... chissà
 
Plausibilmente c'è qualche carattere strano (invisibile o non-ascii) che sta dando problemi. Non è facilissimo diagnosticare questo problema senza farti fare diverse prove, ma su un forum si fa fatica a chattare in tempo reale. Non ho idea se è questo il caso, ma sono problemi che possono capitare se quando si fa copia e incolla invece di scrivere a mano; per esempio, in se copi da un pdf può capitare che al posto di trovare le virgolette "ascii" trovi quelle unicode “unicode”. La stessa cosa può accadere con spazi, parentesi e altri simboli.

Facciamo così, ne approfitto per spiegarti la soluzione che ho postato precedentemente.
C:
#include <stdio.h>

// La costante MAXLEN vale 32; ovvero, ogni volta che scrivo MAXLEN è come se
// stessi scrivendo 32.
#define MAXLEN 32

int main(void) {
    char input[MAXLEN];                              // Definisco una stringa di (al più) MAXLEN caratteri.
    printf("Inserisci il numero: ");                 // Stampo un messaggio a schermo: "Inserisci il numero: ".

    // Voglio leggere una stringa (il numero di telefono) che potenzialmente
    // potrebbe contenere degli spazi. Al posto di usare scanf che, se non usata
    // bene, da problemi con gli spazi, preferisco usare fgets.
    //
    // La funzione fgets ha tre parametri:
    // 1) dove memorizzare la stringa che vado a leggere (nella variabile input);
    // 2) quanti caratteri (al massimo) devo leggere (non più di MAXLEN = 32); e
    // 3) da dove devo leggere questo input (da stdin).
    //
    // Con "stdin" vado ad indicare un posto speciale chiamato standard input
    // che sarebbe il posto (rimango sul generico) dove l'utente scrive.
    fgets(input, MAXLEN, stdin);

    char output[MAXLEN];                             // Definisco un'altra stringa di (al più) MAXLEN caratteri.
    for (int i = 0, k = 0; input[i] != '\0'; i++) {  // Per ogni carattere dato in input:
        if ('0' > input[i] || input[i] > '9') {      //     se il carattere non è un numero:
            //-------------------------------------------
            // QUESTO RIGA È PER DEBUGGARE IL TUO CODICE
            // AI FINI DELL'ESERCIZIO SI PUÒ RIMUOVERE.
            printf("DEBUG: %x => %c\n", input[i], input[i]);
            //-------------------------------------------
            continue;                                //         passa al carattere successivo
        }

        // Questa parte di codice viene eseguita solo quando non entriamo
        // nell'if precedente. Quindi, sappiamo che input[i] contine una cifra
        // (i.e., un numero da '0' a '9').

        output[k++] = input[i];                      //     copia il carattere nella k-esima posizione di output, poi incrementa k
        if (k == 3 || k == 7)                        //     se k è uguale a 3 oppure è uguale a 7:
            output[k++] = '.';                       //         copia il '.' nella k-esima posizione di output, poi incrementa k

        // Perché stiamo controllando se k è uguale a 3 oppure a 7? Considera il
        // numero 404.817.6900, in che posizione abbiamo messo il '.'?
        //
        // 404.817.6900
        //    ^   ^
        //    3   7
        //
        // Il primo è in posizione 3 e il secondo in posizione 7.
    }

    printf("Numero inserito: %s\n", output);         // Stampo a schermo il risultato.
    return 0;                                        // Esco dal programma.
}
Questo codice, oltre a risolvere l'esercizio, dovrebbe anche aiutarci a capire perché la scanf non sta funzionando sul tuo computer. Compila, esegui e buttaci dentro lo stesso input che hai messo fin ora. Poi posta uno screenshot dell'output. Se ho ragione, dovremmo notare qualche carattere non-ascii. Se non ci sarà niente di strano, può essere che il carattere non-ascii sia nel tuo codice sorgente.

Ho notato che in un compilatore online e se copio il numero da una parte e lo incollo sul mio di compilatore, il codice funziona perfettamente;
Hai provato ad eseguire il tuo programma dal terminale?