Stringa in linguaggio C

di il
9 risposte

Stringa in linguaggio C

Dovrei definire una stringa di caratteri, possibilmente senza limitarne la dimensione, inserendo il testo da tastiera durante l'esecuzione. Successivamente dovrei trovare la lunghezza della stringa, solo dei valori alfabetici, solo dei caratteri maiuscoli, delle cifre decimali, delle spaziature e poi il numero di parole alfabetiche.
Io riesco a definire la stringa sia con scanf che con gets, ma usando la scanf ma calcola la lunghezza della stringa solo fino alla prima spaziatura, mentre con la gets me la misura tutta, tuttavia con i passaggi successivi non riuscivo a procedere correttamente.

Mi era stato proposto un modo usando la scanf, facendo: scanf("%[^\n]s, stringa);
così facendo riuscivo a risolvere la lunghezza della stringa, il numero di caratteri alfabetici e il numero di caratteri maiuscoli; però non riesco a capire che senso ha quella parentesi quadra anche se so che per il resto dello svolgimento che ho usato io è necessario, poiché con solo il %s non fornisce il risultato che dovrebbe.

Come potrei fare ? Cosa significa quel %[^\n]s ? Potreste aiutarmi per favore ?

Grazie in anticipo

9 Risposte

  • Re: Stringa in linguaggio C

    astrumbale ha scritto:


    Dovrei definire una stringa di caratteri, possibilmente senza limitarne la dimensione
    Non puoi non limitarne la dimensione.
    Io riesco a definire la stringa sia con scanf che con gets
    Con quelle funzioni esegui l'input non definisci la stringa.
    con la gets me la misura tutta, tuttavia con i passaggi successivi non riuscivo a procedere correttamente.
    Questa cosa è un po' confusa ... la gets non misura nulla ...
    Mi era stato proposto un modo usando la scanf, facendo: scanf("%[^\n]s, stringa);
    così facendo riuscivo a risolvere la lunghezza della stringa, il numero di caratteri alfabetici e il numero di caratteri maiuscoli; però non riesco a capire che senso ha quella parentesi quadra anche se so che per il resto dello svolgimento che ho usato io è necessario, poiché con solo il %s non fornisce il risultato che dovrebbe.
    Anche questo non si capisce che vuol dire ...
    Come potrei fare ? Cosa significa quel %[^\n]s ?
    Significa che sono accettati in input per la stringa tutti i caratteri tranne \n (che viene scartato)

    A questo punto non ti rimane che spiegare meglio il tuo problema perché ancora non si è capito quasi nulla ...
  • Re: Stringa in linguaggio C

    So che eseguo l'input e non definisco, mi scuso per il linguaggio poco da programmatore diciamo XD

    comunque, usando la gets per inserire il testo e misurando la lunghezza della stringa con strlen mi misura tutta la strina fino a \n.
    Usando invece scanf("%s", stringa) e misurando poi la lunghezza della stringa con strlen, mi misura solo fino al primo spazio e non il resto.

    Con scanf("%[^\n]s", stringa), strlen(stringa) mi misura tutta la stringa, mentre con il solo %s non lo faceva.

    Mi chiedevo perché non mi calcola l'intera lunghezza inserendo la stringa semplicemente mettendo il %s nella scanf
    E perché conn la gets, con i passaggi successivi non mi ritorna i valori che dovrebbe, ovvero:
    numero caratteri alfabetici;
    numero caratteri alfabetici maiuscoli.
  • Re: Stringa in linguaggio C

    Difatti la scanf("%s") interrompe la lettura al primo carattere di spaziatura, che sia un a capo, uno spazio o un carattere di tabulazione.. la domanda era solo "cosa significa %[\n]s" o c'è altro?
  • Re: Stringa in linguaggio C

    comunque, usando la gets per inserire il testo e misurando la lunghezza della stringa con strlen mi misura tutta la strina fino a \n.
    E questo va bene ... no?
    Usando invece scanf("%s", stringa) e misurando poi la lunghezza della stringa con strlen, mi misura solo fino al primo spazio e non il resto.
    Perché l'opzione %s funziona proprio così, l'input si ferma al primo spazio e quindi il contenuto della stringa sarà solo la prima parola.
    Con scanf("%[^\n]s", stringa), strlen(stringa) mi misura tutta la stringa, mentre con il solo %s non lo faceva.
    Proprio perché in questo modo significa "prendi tutti i caratteri fino a \n" e quindi a questo punto include anche gli spazi.
  • Re: Stringa in linguaggio C

    tuixte ha scritto:


    Difatti la scanf("%s") interrompe la lettura al primo carattere di spaziatura, che sia un a capo, uno spazio o un carattere di tabulazione.. la domanda era solo "cosa significa %[\n]s" o c'è altro?
    C'è altro, come faccio a riprodurre a video:
    1) il numero di cifre decimali;
    2) il numero di caratteri spaziatura;
    3) il numero di parole (solo alfabetiche) digitate ?
  • Re: Stringa in linguaggio C

    1) che intendi ? Fai un esempio ...

    2) conta gli spazi scorrendo la stringa, con un contatore ...

    3) conta le parole aiutandoti con gli spazi trovati (se non sai usare funzioni più specifiche) ...

    Per essere chiari ... nel forum si fa una domanda per volta, in genere mostrando del codice sorgente già preparato e ragionando su quello ...
  • Re: Stringa in linguaggio C

    Questo è il codice fatto fino ad ora:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #define N 1000

    int isalfalung(char *s);
    int ismaiusc(char *s);
    int cifre_decimali(char *s);

    int main()
    {
    char s[N];
    int lunghezza;

    printf("Inserisci testo: ");
    scanf("%[^\n]s", s);

    lunghezza = strlen((s));

    printf("\nIl numero di caratteri della stringa e' : %d\n", lunghezza);

    printf("Il numero dei caratteri alfabetici della stringa e': %d\n", isalfalung(s));

    printf("Il numero di caratteri maiuscoli e' : %d\n", ismaiusc(s));

    printf("Il numero di cifre decimali e' : %d\n", cifre_decimali(s));

    return 0;
    }

    int isalfalung(char *s)
    {
    int n=0;

    do{
    if(((*s>='a' && *s<='z')||(*s>='A' && *s<='Z')))
    {
    n++;
    }

    }
    while(*s++ != '\0');

    return n;
    }

    int ismaiusc(char *s)
    {
    int m=0;

    do{
    if(isalpha(*s))
    {
    if(*s>='A' && *s<='Z')
    {
    m++;
    }
    }
    }
    while(*s++ != '\0');

    return m;
    }

    int cifre_decimali(char *s)
    {
    int c=0;

    do{
    if(*s>=1 || *s<=1)
    {
    c++;
    }
    }
    while(*s++ != '\0');

    return c;
    }


    Gli ultimi due punti ancora non ci sono perché sto cercando di risolvere il problema delle cifre decimali
  • Re: Stringa in linguaggio C

    Sì ma così non si capisce nulla ... indenta il codice e usa i tag CODE per postare il codice nel forum ... leggi il regolamento ...

    E scrivi nella sezione C/C++ ... chiedi ad un moderatore ...
  • Re: Stringa in linguaggio C

    Ma usare fgets() era troppo semplice e performante?
Devi accedere o registrarti per scrivere nel forum
9 risposte