[C] Estrazione delle parole con una iniziale specifica

di il
13 risposte

[C] Estrazione delle parole con una iniziale specifica

Ciao a tutti,
devo fare un programma che dato un numero n di parole che si vogliono inserire,
data una lettera c in input
date n parole

inserisca in un nuovo vettore le parole che iniziano con la lettera c

Mi sembra che il codice sia piuttosto semplice ed intuitivo, ma alla fine dell'inserimento mi da
Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted.
Questo è il codice
#include <stdio.h>
#include <string.h>

int main() {
	char vettore[100][20], estratti[100][20];
	char c;

	int i, n=0, p;
	
	//Numero delle parle che si vogliono inserire
	printf("Quante parole vuoi inserire? ");
	scanf("%d", &p);

	//Carattere che si vuole cercare
	printf("Inserisci carattere: ");
	scanf("%s", &c);

	//Inserimento delle parole
	for(i=0;i<p;i++) {
		printf("Inserisci parola numero %d: ", i+1);
		scanf("%s", vettore[i]);
	}
	
	//Estrazione delle parole cercate
	for(i=0;i<100;i++) {
		if (vettore[i][0]==c) {
			strcpy(estratti[n], vettore[i]);
			n++;
		}
	}

}

13 Risposte

  • Re: [C] Estrazione delle parole con una iniziale specifica

    Devi iterare per gli elementi effettivamente inseriti nel vettore non per 100.
  • Re: [C] Estrazione delle parole con una iniziale specifica

    ixamit ha scritto:


    Devi iterare per gli elementi effettivamente inseriti nel vettore non per 100.
    Quindi dici così? Non funziona lo stesso...
    
    	for(i=0;i<p;i++) {
    		if (vettore[i][0]==c) {
    			strcpy(estratti[n], vettore[i]);
    			n++;
    		}
    	}
  • Re: [C] Estrazione delle parole con una iniziale specifica

    Spiegare *non funziona*
  • Re: [C] Estrazione delle parole con una iniziale specifica

    Eh scusa, intendevo dire che adesso l'errore è comunque lo stesso di prima...
  • Re: [C] Estrazione delle parole con una iniziale specifica

    
    #include <stdio.h>
    #include <string.h>
    
    int main() {
       char vettore[100][20], estratti[100][20];
       char c;
    
       int i, n=0, p;
       
       //Numero delle parle che si vogliono inserire
       printf("Quante parole vuoi inserire? ");
       scanf("%d", &p);
    
       //Carattere che si vuole cercare
       printf("Inserisci carattere: ");
       scanf("%s", &c);
    
       //Inserimento delle parole
       for(i=0;i<p;i++) {
          printf("Inserisci parola numero %d: ", i+1);
          scanf("%s", vettore[i]);
       }
       
       //Estrazione delle parole cercate
       for(i=0;i<p;i++) {
          if (vettore[i][0]==c) {
    		 strcpy(estratti[n], vettore[i]);
             n++;
          }
       }
       
       for(i=0;i<n;i++) {
    	 printf("%s\n",estratti[i]);
       }
      return 0;
    }
    
    
    Quante parole vuoi inserire? 3
    Inserisci carattere: p
    Inserisci parola numero 1: pippo
    Inserisci parola numero 2: pluto
    Inserisci parola numero 3: topolino
    pippo
    pluto
    
    A me compila, nessun problema in memoria e viene eseguito.

    edit: ok
    visto la scanf su c deve prevedere 'c' non 's'
  • Re: [C] Estrazione delle parole con una iniziale specifica

    ixamit ha scritto:


    
    #include <stdio.h>
    #include <string.h>
    
    int main() {
       char vettore[100][20], estratti[100][20];
       char c;
    
       int i, n=0, p;
       
       //Numero delle parle che si vogliono inserire
       printf("Quante parole vuoi inserire? ");
       scanf("%d", &p);
    
       //Carattere che si vuole cercare
       printf("Inserisci carattere: ");
       scanf("%s", &c);
    
       //Inserimento delle parole
       for(i=0;i<p;i++) {
          printf("Inserisci parola numero %d: ", i+1);
          scanf("%s", vettore[i]);
       }
       
       //Estrazione delle parole cercate
       for(i=0;i<p;i++) {
          if (vettore[i][0]==c) {
    		 strcpy(estratti[n], vettore[i]);
             n++;
          }
       }
       
       for(i=0;i<n;i++) {
    	 printf("%s\n",estratti[i]);
       }
      return 0;
    }
    
    
    Quante parole vuoi inserire? 3
    Inserisci carattere: p
    Inserisci parola numero 1: pippo
    Inserisci parola numero 2: pluto
    Inserisci parola numero 3: topolino
    pippo
    pluto
    
    A me compila, nessun problema in memoria e viene eseguito.

    edit: ok
    visto la scanf su c deve prevedere 'c' non 's'
    Non ho capito.
    Comunque anche a me compila e esegue, però mi da comunque l'errore
    Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted.
  • Re: [C] Estrazione delle parole con una iniziale specifica

    Cambia
    
    scanf("%s", &c);
    
    in:
    
    scanf("%c", &c);
    
  • Re: [C] Estrazione delle parole con una iniziale specifica

    A ma con %c non funziona.
    Non mi fa neanche inserire l'input, mi viene scritto
    Inserire carattere: Inserire parola numero 1
  • Re: [C] Estrazione delle parole con una iniziale specifica

    Torre92 ha scritto:


    A ma con %c non funziona.
    Non mi fa neanche inserire l'input, mi viene scritto
    Inserire carattere: Inserire parola numero 1
    Non ti funziona perchè la scanf precedente mantiene il '\n' che viene rilasciato dalla scanf 'inserisci carattere'. Bisogna togliere quel char di troppo. Correggi:
    
    scanf(" %c", &c);
    
    Fai attenzione allo spazio prima del segno di percentuale
  • Re: [C] Estrazione delle parole con una iniziale specifica

    Perfetto, ho capito... solo che invece che lo spazio, prima dello scanf ho messo
    fflush(stdin);
    ma l'errore da cosa era generato precisamente? Me lo sapresti spiegare?
    E comunque grazie mille.
  • Re: [C] Estrazione delle parole con una iniziale specifica

    Gli errori erano due:
    1) iteravi su tutti e 100 gli elementi del vettore, quando tu ne usavi solo una parte 'p'. Dato che un vettore non viene inizializzato (a meno che sia 'static') rischiavi di entrare nella condizione 'verificata' e usando da strcpy (altamente pericolosa), copiare blocchi di memoria fino al carattere di fine stringa (poteva essere chissà in che posizione), con rischio di un Segment Fault.
    Prossimamente abituati ad usare la strncpy che copia un numero determinato di chars al massimo (sicura)
    2) la scanf attendeva una stringa (s), per cui 2 chars minimo (uno in più per il terminatore di stringa), per come l'avevi dichiarata.
    Il formato è identico alla printf
    Dato che la scanf è una funzione di libreria, l'errore sul comportamento può differire da vari compilatori. Nel tuo caso veniva segnalato con un blocco in run-time, nel mio caso nemmeno valgrind (sofware per il profiling, memory leaks, ecc) mi ha trovato nulla.

    Una particolare attenzione al fflush, che hai utilizzato che svutare stdin.
    NON è portabile ma.... mi sono stufato di dirlo e arrangiatevi, del resto zio GUGGLE esiste anche per questo
  • Re: [C] Estrazione delle parole con una iniziale specifica

    Ah, sono al primo anno di Ing.Informatica, cercherò di imparare da queste cose!
    Intanto ti ringrazio di nuovo!
  • Re: [C] Estrazione delle parole con una iniziale specifica

    E' stato un piacere, grazie a te
Devi accedere o registrarti per scrivere nel forum
13 risposte