Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C] Matrice di char

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113

    [C] Matrice di char

    Ciao a tutti.
    Devo inserire in una matrice dei caratteri. Inizialmente ho fatto in questo modo:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define n 100
    #define m 100
    
    int main()
    
    {
        char MAT[n][m];
        int i, j, N, M;
    
        printf("Inserisci il numero di righe N : \n");
        scanf("%d", &N);
    
        printf("Inserisci il numero di clonne M : \n");
        scanf("%d", &M);
        printf("\n");
    
        printf("Inserisci gli elementi della matrice MAT\n\n");
    
    
        for ( i = 0; i < N; i++ ) {
            for ( j = 0; j < M; j++ ) {
                printf( "Inserisci il carattere [%d][%d] : \n", i, j );
                scanf("%s", &MAT[i][j]);
            }
        }
    
        printf("La matrice MAT è : \n");
    
        for ( i = 0; i < N; i++ ) {
            for ( j = 0; j < M; j++ ) {
                printf("%c", MAT[i][j]);
                printf("\t");
            }
            printf("\n");
        }
    return 0;
    }
    facendo cioè la memorizzazione del carattere nella matrice in questo modo :
    codice:
    scanf("%c", &MAT[i][j]);
    ma a quanto pare non era la forma corretta in quanto mi chiedeva ciclicamente l'inserimento di 2 elementi per volta, poi ho fatto in questo modo:
    codice:
    scanf("%s", &MAT[i][j]);
    cioè cambiando il tipo di dato da char a string e va tutto bene.
    Il problema è che non mi è chiaro perchè non era corretto definire il tipo di dato char e invece va bene con string se gli elementi che inserisco sono di tipo char ??????
    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Quote Originariamente inviata da sizeof Visualizza il messaggio
    Ciao a tutti.
    Devo inserire in una matrice dei caratteri. Inizialmente ho fatto in questo modo:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define n 100
    #define m 100
    
    int main()
    
    {
        char MAT[n][m];
        int i, j, N, M;
    
        printf("Inserisci il numero di righe N : \n");
        scanf("%d", &N);
    
        printf("Inserisci il numero di clonne M : \n");
        scanf("%d", &M);
        printf("\n");
    
        printf("Inserisci gli elementi della matrice MAT\n\n");
    
    
        for ( i = 0; i < N; i++ ) {
            for ( j = 0; j < M; j++ ) {
                printf( "Inserisci il carattere [%d][%d] : \n", i, j );
                scanf("%s", &MAT[i][j]);
            }
        }
    
        printf("La matrice MAT è : \n");
    
        for ( i = 0; i < N; i++ ) {
            for ( j = 0; j < M; j++ ) {
                printf("%c", MAT[i][j]);
                printf("\t");
            }
            printf("\n");
        }
    return 0;
    }
    facendo cioè la memorizzazione del carattere nella matrice in questo modo :
    codice:
    scanf("%c", &MAT[i][j]);
    ma a quanto pare non era la forma corretta in quanto mi chiedeva ciclicamente l'inserimento di 2 elementi per volta, poi ho fatto in questo modo:
    codice:
    scanf("%s", &MAT[i][j]);
    cioè cambiando il tipo di dato da char a string e va tutto bene.
    Il problema è che non mi è chiaro perchè non era corretto definire il tipo di dato char e invece va bene con string se gli elementi che inserisco sono di tipo char ??????
    Grazie
    Cioè perchè se definisco una matrice di tipo char, poi quando inserisco i caratteri uno per volta questi devono essere di tipo string e non char????

  3. #3
    In C non esiste il tipo di dato "string", semplicemente le stringhe sono array di caratteri. Il "%s" nella stringa di formato serve semplicemente a dire a scanf che non gli hai passato semplicemente un puntatore ad un singolo char, ma ad un array di char, e quindi può inserire tutti i caratteri che legge nell'array che inizia all'area di memoria che gli hai passato.

    Comunque, nel tuo caso la forma corretta era la prima, con una piccola correzione:
    codice:
    scanf("%c ", &MAT[i][j]);
    Lo spazio dopo %c fa sì che la scanf si "mangi" il ritorno a capo (e altro eventuale whitespace) invece di lasciarlo nel buffer. Questo normalmente non è necessario (la scanf di base salta implicitamente spazi e ritorni a capi), ma %c acquisisce anche il whitespace.

    Con %s funzionava perché gli stavi facendo considerare ogni elemento come inizio di una stringa; inserendo da tastiera un solo carattere, scanf lo depositava nel primo elemento della stringa (ovvero, l'elemento di matrice passato) seguito dal carattere terminatore (il \0), che però veniva sovrascritto al momento di scrivere l'elemento successivo (nota che qui il whitespace veniva ignorato, solo %c non lo ignora).
    Complessivamente andava, ma avevi sicuramente un piccolo buffer overflow (l'ultimo terminatore letto finiva fuori dall'array) e la potenzialità per un grande buffer overflow (se l'utente inseriva più di un carattere).
    Ultima modifica di MItaly; 02-10-2013 a 19:25
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Quindi se non ho capito male quando definisco
    codice:
    char MAT[n][m];
    vado a definire un array di caratteri. In questo array di caratteri io posso inserire i caratteri sotto forma di singoli char oppure di stringhe. Ovviamente se inserisco direttamente una stringa da tastiera (con tipo %s), supponiamo della lunghezza di una riga, questa sarà inserita mettendo ogni singolo carattere in ciascun campo dell'array.
    Mentre se inserisco un carattere per volta ( con tipo %c) verrà comunque considerato come stringa ma di un singolo carattere, giusto?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da sizeof Visualizza il messaggio
    In questo array di caratteri io posso inserire i caratteri sotto forma di singoli char oppure di stringhe.
    Ti è stato detto che non esiste il concetto di stringa.

    Sono soltanto caratteri che puoi intendere in sequenza (come fosse una stringa) o singolarmente.

    considerato come stringa ma di un singolo carattere, giusto?
    NO... Sarà solo un carattere .... non esistono le stringhe ... Nel caso di %s viene indicato un puntatore in memoria per depositare una "successione di caratteri" ... che non sono una stringa per il C ma solo una successione di caratteri.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Ok benissimo quindi per il concetto di stringa è come successione di char.
    Un'altra cosa, sto utilizzando questa funzione del file di intestazione <ctype.h> della libreria per la gestione dei caratteri.
    Ho notato che, utilizzandola in questo modo, non va:
    codice:
    printf("Inserisci il carattere da cercare : \n");
        scanf("%c", &car);
        car = toupper(car);
    mentre in questo modi si :
    codice:
    printf("Inserisci il carattere da cercare : \n");
        scanf("%c", &car);
        car = toupper(car);
    PERCHÈ MAI?
    Ultima modifica di sizeof; 02-10-2013 a 20:32

  7. #7
    Non vedo alcuna differenza tra i due spezzoni di codice... In ogni caso, se si tratta di un altro problema devi aprire una discussione separata.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    codice:
    mentre in questo modi si :
    E quale sarebbe la differenza, scusa?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Scusate la seconda è così :
    codice:
    printf("Inserisci il carattere da cercare : \n");
        scanf("%s", &car);
        car = toupper(car);

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.