[C] Problema con programma
Sto scrivendo un programma per la conversione da codice dei colori delle resistenze a valore numerico ma mi sono inchiodato su un pezzo di funzione.
Allego quello che ho fatto
Nella funzione colore ho dichiarato la variabile "colori" su consiglio; siccome a quanto ho capito non potevo fare direttamente un confronto tra la variabile "colori" e la variabile "line", devo copiare in una nuova variabile il contenuto letto da "colori" per poi confrontarlo.
Non riesco a capire quale sia il problema, siccome il mio libro di testo mi dice che esistono le funzioni strcmp e strcpy, dicendo cosa sono ma non come si usano.
Allego quello che ho fatto
Nella funzione colore ho dichiarato la variabile "colori" su consiglio; siccome a quanto ho capito non potevo fare direttamente un confronto tra la variabile "colori" e la variabile "line", devo copiare in una nuova variabile il contenuto letto da "colori" per poi confrontarlo.
Non riesco a capire quale sia il problema, siccome il mio libro di testo mi dice che esistono le funzioni strcmp e strcpy, dicendo cosa sono ma non come si usano.
Risposte
Il tipo char rappresenta un singolo carattere (normalmente di un byte). Per cui non è grande abbastanza da contenere le tue stringhe. Per passare una stringa ad una funzione devi usare un puntatore:
Ma in realtà, come già si vede dai commenti che ho inserito, la funzione non ha alcun senso. Che cosa dovrebbe fare? Il main è forse un po' più sensato, ma perché non passi argomenti alla funzione colore? Dovresti scrivere colore(line).
void colore(char *line){ const char * colori[]={"nero", "marrone", "rosso", "arancio", "giallo", "verde", "blu", "viola", "grigio", "bianco"}; int i; strcpy(line,*colori); /* <<< che cosa dovrebbe significare? */ line = "rosso"; /* ???? */ for (i=0, i<10, i++){ /* 10 è il numero di colori? */ if (!strcmp(line, colori)); /* perché c'è un punto di domanda dopo all'if? */ break; } }
Ma in realtà, come già si vede dai commenti che ho inserito, la funzione non ha alcun senso. Che cosa dovrebbe fare? Il main è forse un po' più sensato, ma perché non passi argomenti alla funzione colore? Dovresti scrivere colore(line).
Mi hanno detto che non potendo confrontare direttamente il puntatore con un'altra stringa, devo copiarla dentro un'altra variabile char e fargli lì il confronto.
Il line = "rosso"; me l'aveva scritto il prof dicendomi di assegnare direttamente un valore alla variabile line, che poi se fosse uguale a quello che viene inserito allora ok, sennò fa il confronto tra la line e colori.
Il punto esclamativo m'è sfuggito...probabilmente errore di battitura.
Il line = "rosso"; me l'aveva scritto il prof dicendomi di assegnare direttamente un valore alla variabile line, che poi se fosse uguale a quello che viene inserito allora ok, sennò fa il confronto tra la line e colori.
Il punto esclamativo m'è sfuggito...probabilmente errore di battitura.
Un esempio di funzione che permette di cercare una stringa in un array di stringhe è il seguente (con un esempio di utilizzo):
Immagino (e spero) che tu abbia solo capito male i consigli che ti sono stati dati. Non hanno infatti molto senso.
/* Restituisce un numero compreso tra 0 e n (incluso) uguale all'indice i * per cui str sia uguale a list[i]. Se tale indice non esiste, viene * restituito n. */ unsigned strfind(const char *str, const char **list, unsigned n) { unsigned i = 0; while (i < n && strcmp(str, list[i]) != 0) { ++i; } return i; } int main(void) { const char *sette = "Sette"; const char cinque[] = "Cinque"; const char *numeri[] = {"Zero", "Uno", "Due", "Tre", "Quattro", "Cinque", "Sei", "Sette", "Otto", "Nove"}; unsigned n = sizeof(numeri)/sizeof(const char *); printf("7 == %u\n", strfind(sette, numeri, n)); printf("5 == %u\n", strfind(cinque, numeri, n)); printf("0 == %u\n", strfind("Zero", numeri, n)); printf("%u == %u\n", n, strfind("NotANumber", numeri, n)); return 0; }
Immagino (e spero) che tu abbia solo capito male i consigli che ti sono stati dati. Non hanno infatti molto senso.
Non compila sto esempio.
Probabilmente avrò capito male io.
Non capisco però questo esempio. Perchè si usa un puntatore per la stringa "Sette" e non lo si usa per cinque?
Quello che io voglio fare è, data una stringa di caratteri (colori) da tastiera, il programma mi restituisca il valore che attribuisco ad ogni colore. Con l'ordine che gli ho dato, con i rispettivi indici il valore numerico dovrebbe essere giusto (da 0 a 9) Fatto questo poi dovrei riuscire ad implementarlo...
Probabilmente avrò capito male io.
Non capisco però questo esempio. Perchè si usa un puntatore per la stringa "Sette" e non lo si usa per cinque?
Quello che io voglio fare è, data una stringa di caratteri (colori) da tastiera, il programma mi restituisca il valore che attribuisco ad ogni colore. Con l'ordine che gli ho dato, con i rispettivi indici il valore numerico dovrebbe essere giusto (da 0 a 9) Fatto questo poi dovrei riuscire ad implementarlo...
Non compila probabilmente perché ho dimenticato di copiare le librerie da includere all'inizio dell'esempio. Ti ho scritto l'intero programma. Io riesco a compilarlo e lanciarlo senza problemi (ho provato su diversi compilatori).
Per quanto riguarda la differenza tra cinque e sette, volevo mostrarti che la funzione non ha problemi a gestire stringhe definite in modo diverso. sette è un puntatore ad una qualche stringa, cinque è un array (immutabile in questo caso ma non ha importanza) di 7 caratteri contenente la stringa e "Zero" è stato passato alla funzione come string literal.
Il programma che ti ho scritto, può essere modificato per fare quello che desideri. Nel main dovrai leggere un stringa (con il metodo che preferisci). Se usi fgets, devi stare attento al fatto che fgets inserisce nella stringa il carattere di a capo. Se scrivi "marrone" e poi premi invio, la stringa letta sarà "marrone\n" e non "marrone". Una volta letto il colore dovrai semplicemente passare la stringa e l'array di colori a strfind per ottenere l'indice di quel colore nell'array. Nota che strfind restituisce n in caso di errore solo per semplicità di scrittura ma può essere modificata per restituire altri valori (per esempio -1) in caso di errore.
#include <stdio.h> #include <string.h> /* Restituisce un numero compreso tra 0 e n (incluso) uguale all'indice i * per cui str sia uguale a list[i]. Se tale indice non esiste, viene * restituito n. */ unsigned strfind(const char *str, const char **list, unsigned n) { unsigned i = 0; while (i < n && strcmp(str, list[i]) != 0) { ++i; } return i; } int main(void) { const char *sette = "Sette"; const char cinque[] = "Cinque"; const char *numeri[] = {"Zero", "Uno", "Due", "Tre", "Quattro", "Cinque", "Sei", "Sette", "Otto", "Nove"}; unsigned n = sizeof(numeri)/sizeof(const char *); printf("7 == %u\n", strfind(sette, numeri, n)); printf("5 == %u\n", strfind(cinque, numeri, n)); printf("0 == %u\n", strfind("Zero", numeri, n)); printf("%u == %u\n", n, strfind("NotANumber", numeri, n)); return 0; }
Per quanto riguarda la differenza tra cinque e sette, volevo mostrarti che la funzione non ha problemi a gestire stringhe definite in modo diverso. sette è un puntatore ad una qualche stringa, cinque è un array (immutabile in questo caso ma non ha importanza) di 7 caratteri contenente la stringa e "Zero" è stato passato alla funzione come string literal.
Il programma che ti ho scritto, può essere modificato per fare quello che desideri. Nel main dovrai leggere un stringa (con il metodo che preferisci). Se usi fgets, devi stare attento al fatto che fgets inserisce nella stringa il carattere di a capo. Se scrivi "marrone" e poi premi invio, la stringa letta sarà "marrone\n" e non "marrone". Una volta letto il colore dovrai semplicemente passare la stringa e l'array di colori a strfind per ottenere l'indice di quel colore nell'array. Nota che strfind restituisce n in caso di errore solo per semplicità di scrittura ma può essere modificata per restituire altri valori (per esempio -1) in caso di errore.
Si, ho aggiunto altre due librerie e compila perfettamente.
Allora uso questo qui per farlo.
Mi è stato consigliato di usare la fgets anzichè la scanf per compatibilità o altro. Non ho ben capito.
Di solito gli definisco un vettore abbastanza lungo per evitare proprio problemi dell'"a capo".
Per passare la stringa e l'array a strfind uso un strcpy tra la stringa inserita con fgets e colori?
Allora uso questo qui per farlo.
Mi è stato consigliato di usare la fgets anzichè la scanf per compatibilità o altro. Non ho ben capito.
Di solito gli definisco un vettore abbastanza lungo per evitare proprio problemi dell'"a capo".
Per passare la stringa e l'array a strfind uso un strcpy tra la stringa inserita con fgets e colori?