PDA

Visualizza la versione completa : [C] Ricerca carattere in una matrice e "segmentation fault"


Beorn82
13-02-2007, 16:26
Salute..

Ho scritto questo programma che fa la ricerca di un particolare carattere all'interno di una matrice. Il tutto funziona ma quando mi stampa toglie fuori anche un "segmentation fault".

Ho controllato e ricontrollato il codice ma a sembra sia corretto mi affido ai vostri occhi più raffinati per farmi capire dove ho toppato



#include <stdio.h>

#define M 100
#define N 100

char mat[M][N];
main()
{
int i,j;
int m, n, k;
char ric;

/*DEFINIZIONE GRANDEZZA DELLA MATRICE*/
printf("inserisci dimensione matrice MxN\n");
scanf("%d%d", &m, &n);

for(i=0; i<m; i++)
for(j=0; j<n; j++){
printf("inserisci caratteri(%d,%d)", i, j);
scanf("%1s", &mat[i][j]);
}
/*CARICAMENTO CARATTERE DA RICERCARE*/
printf("inserisci il carattere da ricercare\n");
scanf("%1s", &ric);

/*STAMPA MATRICE*/
for(i=0; i<m; i++){
printf("\n");
for(j=0; j<n; j++)
printf("%3c", mat[i][j]);
}

printf("\n");

/*RICERCA DEL CARATTERE*/
k=0;
for(i=0; i<m; i++)
for(j=0; j<n; j++){
if(mat[i][j] == ric){
printf("%c trovato in linea %d, colonna %d \n", ric, i+1, j+1);

printf("\n");

/*RICERCA DEL CARATTERE*/
k=0;
for(i=0; i<m; i++)
for(j=0; j<n; j++){
if(mat[i][j] == ric){
printf("%c trovato in linea %d, colonna %d \n", ric, i+1, j+1);

k=1;

}
}

if(k==0){
printf("%c non presente nella matrice", ric);
}
return 0;
}


ringrazio anticipatamente :)

andbin
13-02-2007, 18:05
Se devi prendere un carattere con scanf, devi usare %c

Beorn82
13-02-2007, 19:06
infatti...ma mettendo %c nn so perchè ma mi si sballa il ciclo di immissione mi stampa questo

inserisci caratteri(0,0)inserisci caratteri(0,1)

sulla stessa linea e naturalmente sballa anche la matrice :confused:

se invece metto %1s nn sballa il ciclo ma da quell'errore :master:

oregon
13-02-2007, 20:20
Intanto mancano due parentesi } ... e quindi esistono errori di compilazione che non consentono di provare il codice ...

Per il resto, mi sembra giusto usare %c ...

UltraBeginner
14-02-2007, 09:23
Ecco il codice corretto, spero che i commenti ti siano di aiuto!!! ;)



#include <stdio.h>
#include <stdlib.h>

#define M 100
#define N 100

char mat[M][N];
main()
{
int i,j;
int m, n, k;
char ric;

/*DEFINIZIONE GRANDEZZA DELLA MATRICE*/
printf("inserisci dimensione matrice MxN, prima le righe poi le colonne\n");
scanf("%d%d", &m, &n); // dopo aver preso 'n' avrai battuto il tasto INVIO, questo fa
// si che rimanga il carattere '\n' nel buffer di tastiera,
// quindi se facessi subito una scanf leggeresti \n !!!

getchar(); // questo getchar ti serve per "ripulire" il buffer da quel '\n'
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
{
printf("inserisci carattere alla posizione(%d,%d):", i, j);
scanf("%c", &mat[i][j]);
getchar(); // sempre per pulizia buffer
}
printf("\n");
}


/*STAMPA MATRICE*/
for(i=0; i<m; i++)
{
printf("\n");
for(j=0; j<n; j++)
printf("%3c", mat[i][j]);
}


/* ACQUISIZIONE CARATTERE DA RICERCARE */

printf("\n\ninserisci il carattere da ricercare\n");
scanf("%c", &ric);
printf("\n");

/*RICERCA DEL CARATTERE*/
k=0;
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
{
if(mat[i][j] == ric)
printf("%c trovato in linea %d, colonna %d \n", ric, i+1, j+1);
k=1;
}
}
printf("\n");

if(k==0)
printf("%c non presente nella matrice", ric);

system("pause");
return 0;
}

Beorn82
14-02-2007, 09:36
Originariamente inviato da oregon
Intanto mancano due parentesi } ... e quindi esistono errori di compilazione che non consentono di provare il codice ...

farò più attenzione la prossima volta a fare copia e incolla, scusate

Beorn82
14-02-2007, 10:42
Grazie Ultra..però vorrei capire se secondo te era l'assenza di getchar() e quindi la non pulizia del buffer a causare il segmentation fault e poi :( non mi stampa il caso in cui k==0 eppure dovrebbe farlo..forse ho sbagliato a mettere qualche parentesi :dhò: spero di risolvere il problema..

a dopo in caso!

e grazie ancora

UltraBeginner
14-02-2007, 10:52
We Beorn,

sinceramente non so cosa causasse il segment fault, forse era causato dal fatto che non mettevi %c per prendere il carattere ma non ne sono sicuro.

Per il caso in cui k=0 mea culpa, ho dimenticato le parentesi graffe



if(mat[i][j] == ric)
printf("%c trovato in linea %d, colonna %d \n", ric, i+1, j+1);
k=1;

scritta cosi nel ciclo mettera sempre k=1 perche senza le graffe l'if fa solo la prima istruzione che segue, in questo caso la printf. Se invece scrivi



if(mat[i][j] == ric)
{
printf("%c trovato in linea %d, colonna %d \n", ric, i+1, j+1);
k=1;
}


funziona tutto ;)


Lieto di essere stato utile :)

Saluti! :ciauz: :ciauz:

Beorn82
14-02-2007, 11:02
si infatti ho risolto :)

era quella parentesi..vedrò di documentarmi cmq sul perchè dava quel errore :)

Loading