Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Dubbio sul ciclo for
Forum - C/C++ - Dubbio sul ciclo for

Avatar
drawtine (Normal User)
Newbie


Messaggi: 11
Iscritto: 30/07/2017

Segnala al moderatore
Postato alle 0:37
Mercoledì, 02/08/2017
Salve a tutti, come un utente del forum mi ha consigliato, sto seguendo i lucidi di un docente di Informatica del Politecnico di Torino. Io sono arrivato all'argomento stringhe, ma qui ho trovato un esempio, che non riesco davvero a capire. Il programma prenderebbe in input due strighe (la prima per esempio 'Olimpo', la seconda 'Oio', e dovrebbe stampare 'lmp', eliminando cioè dalla prima stringa i caratteri della seconda). Ecco il codice da lui proposto:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #define MAXCAR 128
  3.  
  4. char *elimina(char str1[], char str2[]);
  5.  
  6. main()
  7. {
  8.         char str1[MAXCAR], str2[MAXCAR];
  9.         printf("Dammi la stringa str1: ");
  10.         scanf("%s", str1);
  11.         printf("Dammi la stringa str2: ");
  12.         scanf("%s", str2);
  13.         printf("str1-str2= %s\n", elimina(str1,str2));
  14. }
  15.  
  16. char *elimina(char str1[], char str2[])
  17. {
  18.         int i, j, k;
  19.         for(i=j=0;str1[i]!='\0';i++)
  20.         {
  21.                 for(k=0;(str2[k]!= '\0') && (str1[i]!=str2[k]);k++);
  22.                         if(str2[k]== '\0')
  23.                                 str1[j++]=str1[i];
  24.         }
  25.         str1[j]='\0';
  26.         return str1;
  27. }


Quello che non capisco è nel secondo for, nelle condizioni: la prima controlla che la stringa non sia finita, ma è la seconda che non capisco.
Da quel che ho capito io, con l'operatore && basterebbe che una delle due condizioni sia falsa per non entrare nel ciclo, ma se le lettere sono uguali, non dovrebbe essere falsa la seconda condizione?

Grazie

PM Quote
Avatar
drawtine (Normal User)
Newbie


Messaggi: 11
Iscritto: 30/07/2017

Segnala al moderatore
Postato alle 1:07
Mercoledì, 02/08/2017
Niente, risolto, non avevo visto il punto e virgola dopo il for...scusate

PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 1:09
Mercoledì, 02/08/2017
attento che nel 2° for c'è un ';' finale

Ecco cosa veramente è:
Codice sorgente - presumibilmente Plain Text

  1. for(k=0;(str2[k]!= '\0') && (str1[i]!=str2[k]);k++)
  2. {
  3.     ;
  4. }
  5. if(str2[k]== '\0')
  6.     str1[j++]=str1[i];



Quell'idendazione è fuorviante. Classico esempio di come una buona idendazione eviti nattate insonni.

EDIT: Visto che hai risolto da solo. Bene

Ultima modifica effettuata da Mikelius il 02/08/2017 alle 1:12
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 14:00
Mercoledì, 02/08/2017
Io avrei scritto piuttosto

Codice sorgente - presumibilmente C/C++

  1. k = 0;
  2. while ((str2[k]!= '\0') && (str1[i]!=str2[k])) {
  3.     k++;
  4. }


Così è chiaro che la mia intenzione è di incrementare l'indice finché non trovo un carattere uguale.
Se proprio si vuole lasciare il for vuoto, meglio usare {} ma non un semplice punto e virgola, troppo facile sbagliare.

PM Quote