PDA

Visualizza la versione completa : [C] Presunto problema strtok() utilizzo con strcmp()


torn24
08-04-2013, 14:35
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/showthread.php?s=&threadid=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











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






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




#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 .

oregon
08-04-2013, 15:04
Quando ripeti il ciclo per un nuovo calcolo, la variabile i deve essere azzerata.

Devi inserire

i=0;

prima della

while(i<2)

torn24
08-04-2013, 15:31
Grazie Oregon , non avrei mai trovato il problema , il do while stata un aggiunta successiva :dh: :D

Loading