Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102

    [C] Problema confronto di due stringhe

    Quando cerco di confrontare due stringhe per ordinarle alfabeticamente mi ritorna dei valori errati, infatti se inserisco due nomi uguali dovrebbe restituirmi il valore 0 invece mi restituisce un valore negativo. Dove sbaglio ?
    codice:
    #include <stdio.h> 
    #include <string.h> 
    #define DIM 2
     int main()
     {     
     char nome[25][DIM];    
     int i;    
     for(i=1;i<=DIM;i++)     
    {         
    printf("inserire il %i° nome: ",i);         
    scanf("%s",nome[i]);    
     }      
     printf("%i",strncmp(nome[1],nome[2],24));
     }

  2. #2

    Re: [C] Problema confronto di due stringhe

    Benvenuto nel forum di HTML.it

    Il codice corretto è questo:
    codice:
    #include <stdio.h> 
    #include <string.h> 
    #define DIM 2
    
    
     int main()
     {     
     char nome[DIM][25];    
     int i;
     
     for(i=1;i<=2;i++)     
     {         
      printf("inserire il %i° nome: ",i);         
      fgets(nome[i-1], sizeof nome[i-1], stdin);  
     } 
          
     int res= !strcmp(nome[0],nome[1]);
          
     printf("%d", res);
     
     getchar();
     getchar();
     }
    Devi notare che:

    1. char nome [25][2]: 2 elementi char di 25 caratteri ciascuno

    2. ho usato la fgets al posto della scanf: il motivo l'ho gia spiegato qua: http://forum.html.it/forum/showthrea...ighlight=fgets ; l'ho descritto per gets ma è identico per scanf.

    3. è ininfluente indicare la lunghezza da controllare nella tua strcmp


    Per qualsiasi dubbio/problema, posta pure.


    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102
    Scusami, ma sono alle prime armi...alcune istruzioni non le ho mai usate, infatti tra queste conosco solo printf e strcmp
    codice:
    fgets(nome[i-1], sizeof nome[i-1], stdin);  
     } 
          
     int res= !strcmp(nome[0],nome[1]);
          
     printf("%d", res);
     
     getchar();
     getchar();
     }

  4. #4
    Originariamente inviato da Ghemon-a
    Scusami, ma sono alle prime armi...alcune istruzioni non le ho mai usate, infatti tra queste conosco solo printf e strcmp
    codice:
    fgets(nome[i-1], sizeof nome[i-1], stdin);  
     } 
          
     int res= !strcmp(nome[0],nome[1]);
          
     printf("%d", res);
     
     getchar();
     getchar();
     }
    Allora, la getchar blocca il flusso del programma per ricevere un input: nel nostro caso serve solo per poter visualizzare l'output (altrimenti la finestra di console si chiuderebbe), l'effetto è quello di system("pause") per capirci.
    La fgets serve per ricevere un input: il 1° argomento è la variabile in cui viene memorizzato l'input, il 2° rappresenta il numero di caratteri da memorizzare, il 3° identifica il tipo di input (console nel nostro caso, oppure da file).

    Visto che sei agli inizi, ti suggerisco di consultare per la sintassi di funzioni/istruzioni questo meraviglioso sito: www.cplusplus.com


    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102
    Ok, adesso è un po più chiaro, tranne qualche cosetta, tipo:
    a cosa serve int ris ..... ?
    perchè nelle parentesi quadre hai inserito i-1 ?

  6. #6
    Originariamente inviato da Ghemon-a
    Ok, adesso è un po più chiaro, tranne qualche cosetta, tipo:
    a cosa serve int ris ..... ?
    perchè nelle parentesi quadre hai inserito i-1 ?
    La strncmp è una funzione che dà come valore di ritorno un numero intero, quindi con quella riga di codice ho dichiarato una variabile int, denominata ris che conterrà il valore di ritorno della funzione in questione. Ciò equivale a:
    codice:
    int ris;
    ris = strncmp(....)
    Ho inserito (i-1) semplicemente perchè il tuo ciclo for andava da 1 a 2, giusto? Le matrici si inizializzano dall'indice 0 e non 1, quindi quando la variabile i = 1 (1° esecuzione del ciclo) popolo l'elemento 0 della matrice nome, quando i = 2 popolo l'elemento 1 della matrice.


    Ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102
    Giusto, che erroraccio...non ho considerato che la matrice parte da zero. Per quanto riguarda strncmp deve essere dichiarata ( in questo casao int) cosa che io non avevo fatto, giusto ?
    Per l'esattezza, dovrei inserire un numero di nomi e confrontarli l'uno con l'altro in modo da elencarli in ordine alfabetico. Il problema è che dovrei fare un sacco di if (secondo l'algoritmo che mi è venuto in mente) ed il programma in questo modo non sarebbe utilizzabile per un numero qualsiasi di nomi. Come potrei fare per confrontare i nomi (con strncmp) senza essere condizionato dal numero di questi ultimi ? ovvvero, esiste un modo che sia indipendente dal numero dei nomi ( 2, 10, 100..... nomi )?
    Spero di essere stato chiaro.

  8. #8
    Devi usare un algoritmo che sfrutta il Bubble Sort, usando sempre la strncmp: in Internet trovi sicuramente un algoritmo già pronto, se non lo trovi lo facciamo noi.


    Ciao

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.