Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] Acquisizione e visualizzazione di stringhe

    Buonasera, devo svolgere un semplice esercizio di acquisizione e visualizzazione di stringhe utilizzando printf e scanf, ma non riesco a farlo funzionare. Potreste gentilmente indicarmi cosa ho sbagliato nel mio codice? Premetto di essere alle prime armi con la programmazione in generale.
    Vi ringrazio anticipatamente per eventuali risposte.


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define D 21
    
    
    int main()
    {
        int N, i;
        char stringa[N][D];
        const char* s;
        
        printf("Inserisci numero stringhe: ");
        scanf("%d", &N);
        while ((N<1) || (N>99))
        {printf("\nNumero non consentito! Reinserire numero stringhe: ");
        scanf ("%d", &N);}
        printf("\n\n");
        for(i=0;i<N;i++)
        {printf("Inserisci stringa %d: ", i+1);
        scanf("%s", s);
        if (strlen(s)==0)
            { printf("Vuota - ripeti\n");
            i--;}
        else 
            {if(strlen(s)>D)
                {printf("Troppo lunga! Max %d caratteri\n", D-1) ;
                i--;}
            else
                {strcpy(stringa[i], s);}}
        }
        printf("\n\nLe stringhe inserite sono: \n");
        for(i=0;i<N;i++)
        {printf("Stringa %d = %s\n", i+1, stringa[i]);}
        return 0;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    perchè è multidimensionale questa?
    char stringa[N][D];




  3. #3
    Quote Originariamente inviata da zacca94 Visualizza il messaggio
    perchè è multidimensionale questa?
    char stringa[N][D];
    Perché l'ho intesa come se fosse una particolare matrice, essendo un vettore di vettore di caratteri; infatti N corrisponde al numero di stringhe totali, specificate dall'utente, mentre D al numero di caratteri massimi consentiti. Ho per caso sbagliato qui?

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Ci sono due problemi:

    1. Quando dichiari stringa
    codice:
    char stringa[N][D];
    La dimensione deve essere nota al momento della compilazione, perchè è definito nello stack. Tu N lo valorizzi solo in seguito, di conseguenza lo "spazio" assegnato a stringa è ignoto. Se N è 0 (ad esempio) stringa non ha memoria disponibile per contenere le tue stringhe. Di conseguenza quando vai a scrivere sull'array vai fuori dai limiti ed il programma crasha
    Quindi o definisci N come hai fatto per D (e quindi poi vai ad usare solo una parte di questo array),
    codice:
    #define D 21
    #define MAXN 99
    
    int main()
    {
        int N, i;
        char stringa[MAXN][D];
    ...
    oppure "sposti" nell heap stringa:
    codice:
    int main()
    {
        int N, i;
        char** stringa;
        char s[D] ;
        printf("Inserisci numero stringhe: ");
        scanf("%d", &N);
        while ((N<1) || (N>99))
        {printf("\nNumero non consentito! Reinserire numero stringhe: ");
        scanf ("%d", &N);}
        printf("\n\n");
        stringa = (char**)malloc(sizeof(char*) * N);
        for(i=0;i<N;i++)
        {
         stringa[i] = (char*)malloc(sizeof(char) * D);
         printf("Inserisci stringa %d: ", i+1);
        scanf("%s", s);
        if (strlen(s)==0)
            { printf("Vuota - ripeti\n");
            i--;}
        else 
            {if(strlen(s)>D)
                {printf("Troppo lunga! Max %d caratteri\n", D-1) ;
                i--;}
            else
                {strcpy(stringa[i], s);}}
        }
        printf("\n\nLe stringhe inserite sono: \n");
        for(i=0;i<N;i++)
        {printf("Stringa %d = %s\n", i+1, stringa[i]);}
        return 0;
    }
    2. Come vedi nel codice qui su ho cambiato s.
    Come hai fatto tu, s è un puntatore che "punta" non si sa sa dove. Quando lo passi alla scanf questa tenta di scrivere nella zona di memoria a cui fa riferimento s che però essendo ignota porta al crash del programma (se sei fortunato). Ricorda che un puntatore DEVE far sempre riferimento ad una zona di memoria valida

  5. #5
    Ti ringrazio boots, anche per la spiegazione dettagliata; finalmente mi hai fatto venire a capo dell'esercizio!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.