Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    [C] Presunto problema strtok() utilizzo con strcmp()

    Ciao , per passatempo ho voluto provare a risolvere un esercizio proposto in un altra discussione , che mi sembra d'obbligo , segnalare .

    http://forum.html.it/forum/showthrea...readid=1541320


    Per risolvere il problema mi sono basato su le informazioni presenti su questo sito

    http://www.electronicprestige.it/codicea.htm

    dove è presente un programma script , che si può usare per ottenere il valore corretto .


    ----------------------------------------------------------------
    Il problema che riscontro nell'esercizio che ho svolto , è che a volte restituisce valori corretti , altre volte valori sbagliati,non trovo errori logici o di "algoritmo usato" ,l'errore sembra dovuto a un errato caricamento di un array di char
    dopo un confronto di una stringa ottenuta con strtok() tramite strcmp()

    Gli errori presumo , risiedono in questi due pezzi di codice







    codice:
    
    temp=strtok(Colori," ");//separa la stringa in sottostrighe 
          while(i<2) //conversione codice colore in numeri delle prime due bande 
          {
             /*per ogni colore inserisce la cifra corrispondente
    	       nel array Valore */
              if(strcmp(temp,"nero")==0)
                 Valore[i]='0';   
              else if(strcmp(temp,"marrone")==0)
                  Valore[i]='1';   
              else if(strcmp(temp,"rosso")==0)
                  Valore[i]='2';   
              else if(strcmp(temp,"arancio")==0)
                  Valore[i]='3';  
              else if(strcmp(temp,"giallo")==0)
                  Valore[i]='4';  
              else if(strcmp(temp,"verde")==0)
                  Valore[i]='5';   
              else if(strcmp(temp,"blu")==0)
                  Valore[i]='6';
              else if(strcmp(temp,"viola")==0)
                  Valore[i]='7';  
              else if(strcmp(temp,"grigio")==0)
                  Valore[i]='8';  
              else if(strcmp(temp,"bianco")==0)
                  Valore[i]='9'; 
              temp=strtok(NULL," ");  //acquisische la sottostriga sucessiva 
              i++;                                  
           }


    e in questo altro punto sembra , a volte dare risultati sbagliati


    codice:
    
    if(strcmp(temp,"argento")==0)
                  moltiplicatore=0.01;  
              else if(strcmp(temp,"nero")==0)
                  moltiplicatore=1;   
              else if(strcmp(temp,"marrone")==0)
                  moltiplicatore=10;
              else if(strcmp(temp,"rosso")==0)
                  moltiplicatore=100;  
              else if(strcmp(temp,"arancio")==0)
                  moltiplicatore=1000;  
              else if(strcmp(temp,"giallo")==0)
                  moltiplicatore=10000;  
              else if(strcmp(temp,"verde")==0)
                  moltiplicatore=100000;
              else if(strcmp(temp,"blu")==0)
                  moltiplicatore=1000000; 
              else if(strcmp(temp,"viola")==0)
                  moltiplicatore=10000000;




    L'intero programma

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    int main(int argc, char *argv[])
    {
      char Colori[50];
      char Valore[3];
      char *temp;
      char Unita_misura;
      int ripete =1;
      int  i=0; 
      float ohm , moltiplicatore;
      do
      {
          printf("Calcolo valore resistenze tradizionali 4 bande \n");
          puts("-----------------------------------------------------------------");
          printf("Inserisci la sucessione dei colori in minuscolo separati da uno spazio :\n");
          gets(Colori);
     
          temp=strtok(Colori," ");//separa la stringa in sottostrighe 
          while(i<2) //conversione codice colore in numeri delle prime due bande 
          {
             /*per ogni colore inserisce la cifra corrispondente
    	       nel array Valore */
              if(strcmp(temp,"nero")==0)
                 Valore[i]='0';   
              else if(strcmp(temp,"marrone")==0)
                  Valore[i]='1';   
              else if(strcmp(temp,"rosso")==0)
                  Valore[i]='2';   
              else if(strcmp(temp,"arancio")==0)
                  Valore[i]='3';  
              else if(strcmp(temp,"giallo")==0)
                  Valore[i]='4';  
              else if(strcmp(temp,"verde")==0)
                  Valore[i]='5';   
              else if(strcmp(temp,"blu")==0)
                  Valore[i]='6';
              else if(strcmp(temp,"viola")==0)
                  Valore[i]='7';  
              else if(strcmp(temp,"grigio")==0)
                  Valore[i]='8';  
              else if(strcmp(temp,"bianco")==0)
                  Valore[i]='9'; 
              temp=strtok(NULL," ");  //acquisische la sottostriga sucessiva 
              i++;                                  
           }  
      
            Valore[i]=0;//aggiungo il terminatore stringa all'array valore
            puts(Valore);/// STAMPO IL VALORE PER DEBUG 
      
        
              /*conversione codice colore terza banda del moltiplicatore 
    	  
    	        temp contiene gia il terzo colore 
    	  
    	      */
       
              if(strcmp(temp,"argento")==0)
                  moltiplicatore=0.01;  
              else if(strcmp(temp,"nero")==0)
                  moltiplicatore=1;   
              else if(strcmp(temp,"marrone")==0)
                  moltiplicatore=10;
              else if(strcmp(temp,"rosso")==0)
                  moltiplicatore=100;  
              else if(strcmp(temp,"arancio")==0)
                  moltiplicatore=1000;  
              else if(strcmp(temp,"giallo")==0)
                  moltiplicatore=10000;  
              else if(strcmp(temp,"verde")==0)
                  moltiplicatore=100000;
              else if(strcmp(temp,"blu")==0)
                  moltiplicatore=1000000; 
              else if(strcmp(temp,"viola")==0)
                  moltiplicatore=10000000; 
           
            ohm=(float)atof(Valore);//converto in float l'array di char valore
            ohm*=moltiplicatore ;//calcolo il valore di resistenza moltiplicando il valore delle due
                             // bande per il moltiplicatore tutti in ohms
    						 
    						 
    	  /*se il valore è superiore a 1000 homs usa unita di misuro kohms
            se il valore è superiore a 1000000 homs usa unita di misura Mohms 
           */		
                             
              if(ohm>1000 && ohm<1000000)
              {
                  ohm/=1000;
                  Unita_misura='K';
              
              } 
              else if(ohm>1000000)
              {
                  ohm/=1000000; 
                  Unita_misura='M';
              
              } 
              else
                  Unita_misura=' ';
              
              puts("-----------------------------------------------------------------");
             // stampa risultati 
             printf("Il valore della reististenza  --> %.00f  %cohms.\n",ohm,Unita_misura);                                                      
             system("PAUSE");
             system("cls");
             printf("Vuoi continuare 1 = si -->  ");
    	     scanf("%d",&ripete);
    	     fflush(stdin);
     }while(ripete==1 );  
      return 0;
    }

    Se qualcuno , potesse aiutarmi , a capire perchè a volte restituisce il valore aspettato e a volte valori sbagliati , ne sarei felice .
    Tecnologia

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Quando ripeti il ciclo per un nuovo calcolo, la variabile i deve essere azzerata.

    Devi inserire

    i=0;

    prima della

    while(i<2)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Grazie Oregon , non avrei mai trovato il problema , il do while è stata un aggiunta successiva
    Tecnologia

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 © 2026 vBulletin Solutions, Inc. All rights reserved.