Confronto tra stringhe in C...

kioccolatino90
ciao a tutti, devo scrivere un programma che confronta due stringhe e calcola quella di maggiore ordine lessico grafico...
io l'ho svolto così:

#include <stdio.h>
#include <stdlib.h>
#define M 20
int strcmp (char str1[], char str2[]);
main (){
     char stringa1[M];
     char stringa2[M];
     int a,b;
     printf ("inserisci la prima parola: ");
     scanf("%s", stringa1);
     printf ("inserisci la seconda parola: ");
     scanf("%s", stringa2);
     a = strcmp (str1[]);
     b = strcmp (str2[]);
system("PAUSE");  
}


questo è il programma...

mentre il sottoprogramma è:
int strcmp (char str1[], char str2[]){
    int i = 0;
    int risp;
    while (str1[i] != '\0' && str2[i] != '\0' && str1[i] == str2[i])
          i = i+1;
    if (str1[i] == '\0' && str2[i] == '\0')
       risp = 0;
    else {
         if (str1[i] == '\0')
            risp = -1;
         else if (str2[i] == '\0')
              risp = 1;
              else {
                   if (str1[i] > str2[i])
                      risp = 1;
                   else {
                        risp = -1;
                        }
                   }
         }
return risp;           
}


comunque il programma principale non è terminato, però mi escono degli errori se vado a lanciare il programma, dice:
expected primary-expression before ']' token
però non capisco perchè... la funzione il prof l'ha chiama come la funzione messa a disposizione, però non è quella, credo l'abbia fatta per farci capire come funziona...

Risposte
ebrunaway
La funzione strcmp e' stata definita su due parametri str1[], str2[] che sono array di caratteri.
Quando, pero', vai ad invocarla sul main usi un solo argomento, mentre la funzione se ne aspetta due, da qui il primo errore (tralaltro gcc oltre ad expected expression before ']' token da anche too few arguments to function strcmp').
Il secondo errore riguarda il fatto che stai facendo confusione tra parametri e argomenti della funzione.
str1[] e str2[] sono identificatori(parametri) che vengono usati da strcmp. Questo significa che la funzione si
aspetta che vengano passati come argomenti due array di caratteri, non si aspetta che vengano passati due array di caratteri con il nome str1[] e str2[].
La funzione puo' essere invocata correttamente come:
strcmp(stringa1, stringa2)

Se tu gli passi str1[],str2[] dentro il main, invece, ti dara' come errore: str1 e str2 variabili non dichiarate.

A tempo di esecuzione, quando strcmp viene eseguita, stringa1 e stringa2 verranno copiati su str1[] e str2[], e la funzione procede correttamente.

Non capisco il doppio assegnamento su a e b, ma credo dipenda dal fatto che non ti e' chiaro cosa faccia la funzione strcmp. Riguardala per capire meglio il significato, avendo a mente che prende in ingresso due stringhe e a seconda dell'esito del confronto restituisce un intero.

Sul main, per avere quello che dovrebbe interessarti, basta dichiarare una variabile, puoi fare ad esempio:
int result
...
result=strcmp(stringa1,stringa2);
printf("l'esito del confronto ha dato come valore: %d\n", result);
...


Non vorrei entrare in merito ad altre cose(perche' magari e' stato il professore a farvelo fare), ma l'uso di system("PAUSE") e' deprecato in C, perche' manca di portabilita'(funziona solo su DOS/Windows) ed e' una funzione molto pesante in termini di risorse spese dal sistema.
Se serve semplicemente a simulare un attesa di un evento nella buona programmazione viene utilizzato getchar() (per esempio con un ciclo che, una volta letto un determinato carattere, vada al passo successivo).
Ultima cosa, il main non ha tipo di ritorno.

kioccolatino90
si è stato il professore a farcelo usare....
Comunque venendo al programma con il tuo gentilissimo aiuto funziona... però volevo chiederti una cosa, se nel programma effettuo i confronti di parole:
abete, casa
romama, roma
tavolo, tavolo

allora nel primo esempio restituisce -1, però la parola abete non è maggiore di casa? Non dovrebbe restituire 1???
gli altri esempi sono giusti...

ebrunaway
Nel primo esempio restituisce -1 perche', per come e' stato definito il confronto tra stringhe in strcmp(), e' valutata prima la dimensione della parola, e dopo la posizione dei caratteri. Essendo casa piu' corta di abete, viene restituito -1.
Sul codice stai eseguendo la parte
 if (str1[i] == '\0')
   risp = -1;

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.