Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    21

    [C] Matrici

    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

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

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Se devi prendere un carattere con scanf, devi usare %c
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    21
    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

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

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ...

  5. #5

    Correzione

    Ecco il codice corretto, spero che i commenti ti siano di aiuto!!!

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>

    #define M 100
    #define N 100

    char mat[M][N];
    main()
    {
            
    int i,j;
            
    int mnk;
            
    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=0i<mi++)
           {
            for(
    j=0j<nj++)
             {
              
    printf("inserisci carattere alla posizione(%d,%d):"ij);
              
    scanf("%c", &mat[i][j]);
              
    getchar();    // sempre per pulizia buffer
             
    }
            
    printf("\n");
           }

         
         
    /*STAMPA MATRICE*/
          
    for(i=0i<mi++)
          {
            
    printf("\n");
            for(
    j=0j<nj++)
             
    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=0i<mi++)
         {
           for(
    j=0j<nj++)
            {
             if(
    mat[i][j] == ric)
               
    printf("%c trovato in linea %d, colonna %d \n"rici+1j+1);
               
    k=1;
             }     
          }
         
    printf("\n");

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


  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    21
    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    21
    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 spero di risolvere il problema..

    a dopo in caso!

    e grazie ancora

  8. #8

    Mea culpa

    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

    Codice PHP:
    if(mat[i][j] == ric)
               
    printf("%c trovato in linea %d, colonna %d \n"rici+1j+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

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

    funziona tutto


    Lieto di essere stato utile

    Saluti!

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    21
    si infatti ho risolto

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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.