PDA

Visualizza la versione completa : [C] Matrice di char


sizeof
02-10-2013, 18:57
Ciao a tutti.
Devo inserire in una matrice dei caratteri. Inizialmente ho fatto in questo modo:


#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 :


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:


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

sizeof
02-10-2013, 19:12
Ciao a tutti.
Devo inserire in una matrice dei caratteri. Inizialmente ho fatto in questo modo:


#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 :


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:


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????

MItaly
02-10-2013, 19:20
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:


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).

sizeof
02-10-2013, 19:40
Quindi se non ho capito male quando definisco


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?

oregon
02-10-2013, 19:45
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.

sizeof
02-10-2013, 20:24
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:


printf("Inserisci il carattere da cercare : \n");
scanf("%c", &car);
car = toupper(car);


mentre in questo modi si :


printf("Inserisci il carattere da cercare : \n");
scanf("%c", &car);
car = toupper(car);


PERCHÈ MAI?

MItaly
02-10-2013, 22:26
Non vedo alcuna differenza tra i due spezzoni di codice... :stordita: In ogni caso, se si tratta di un altro problema devi aprire una discussione separata. :ciauz:

oregon
02-10-2013, 22:52
mentre in questo modi si :

E quale sarebbe la differenza, scusa?

sizeof
03-10-2013, 09:14
Scusate la seconda è così :


printf("Inserisci il carattere da cercare : \n");
scanf("%s", &car);
car = toupper(car);

Loading