PDA

Visualizza la versione completa : [C] Problema confronto di due stringhe


Ghemon-a
27-11-2010, 14:31
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 ?


#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));
}

MdE2005
27-11-2010, 16:11
Benvenuto nel forum di HTML.it :)

Il codice corretto questo:


#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/showthread.php?s=&threadid=1430157&highlight=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 :)

Ghemon-a
27-11-2010, 17:20
Scusami, ma sono alle prime armi...alcune istruzioni non le ho mai usate, infatti tra queste conosco solo printf e strcmp


fgets(nome[i-1], sizeof nome[i-1], stdin);
}

int res= !strcmp(nome[0],nome[1]);

printf("%d", res);

getchar();
getchar();
}

MdE2005
27-11-2010, 17:31
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


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

Ghemon-a
27-11-2010, 17:47
Ok, adesso un po pi chiaro, tranne qualche cosetta, tipo:
a cosa serve int ris ..... ?
perch nelle parentesi quadre hai inserito i-1 ?

MdE2005
27-11-2010, 17:57
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:

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

Ghemon-a
28-11-2010, 16:04
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. :)

MdE2005
28-11-2010, 17:57
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 :)

Loading