[C] conversione da char a int
Ciao ragazzi,vi espongo il mio problema
se ho una stringa della forma 1,2,3 ad esempio.
leggo questa stringa con fscanf e %s
però se poi voglio mettere i singoli valori numeri 1 2 3 all'interno di 3 variabili int,come devo fare?
la funzione atoi mi restituisce solo il primo numero 1
se ho una stringa della forma 1,2,3 ad esempio.
leggo questa stringa con fscanf e %s
però se poi voglio mettere i singoli valori numeri 1 2 3 all'interno di 3 variabili int,come devo fare?
la funzione atoi mi restituisce solo il primo numero 1


Risposte
Prova
scanf ("%d%c%d%c%d");
scanf ("%d%c%d%c%d");
"kobeilprofeta":
Prova
scanf ("%d%c%d%c%d");
ok e a fianco metto le variabili int in cui voglio memorizzare i valori?
tieni conto che devo leggere sempre prima delle stringhe e da qui poi devo risalire ai valori int
Ci sono parecchie alternative:
1. Fare uso di strtol al posto di atoi per la conversione. Questa funzione permette di ottenere un puntatore alla parte della stringa che rimane dopo aver letto il valore intero. Il codice diventa quindi il seguente (senza la verifica degli errori):
2. La seconda soluzione fa uso di (s)scanf ed è più semplice. La stringa di formato in questo caso è "%d,%d,%d" in quanto vuoi leggere tre numeri separati da virgole. Nota che nell'esempio uso sscanf perché leggo da stringa, ma se leggi da console hai bisogno di usare scanf e se è da file fscanf. In questo caso ho anche inserito come si verifica se sono stati letti tutti i numeri.
3. Puoi fare una scansione della stringa per trovare la posizione di tutti i numeri e poi usare atoi a partire da quelle posizioni.
4. Altre possibilità sono certamente possibili ma penso che questo sia sufficiente..
1. Fare uso di strtol al posto di atoi per la conversione. Questa funzione permette di ottenere un puntatore alla parte della stringa che rimane dopo aver letto il valore intero. Il codice diventa quindi il seguente (senza la verifica degli errori):
char string[] = "1,2,3"; char *p = string; char *end = string; int values[3] = { 0 }; for (int i = 0; i < 3; ++i) { values[i] = strtol(p, &end, 10); p = end+1; /* rimuovi virgola.. */ } printf("%s = %d,%d,%d\n", string, values[0], values[1], values[2]);
2. La seconda soluzione fa uso di (s)scanf ed è più semplice. La stringa di formato in questo caso è "%d,%d,%d" in quanto vuoi leggere tre numeri separati da virgole. Nota che nell'esempio uso sscanf perché leggo da stringa, ma se leggi da console hai bisogno di usare scanf e se è da file fscanf. In questo caso ho anche inserito come si verifica se sono stati letti tutti i numeri.
char string[] = "1,2,3"; int values[3] = { 0 }; int ret = sscanf(string, "%d,%d,%d", &values[0], &values[1], &values[2]); if (ret != 3) { fputs("ERROR: Invalid format.\n", stderr); return 1; } printf("%s = %d,%d,%d\n", string, values[0], values[1], values[2]);
3. Puoi fare una scansione della stringa per trovare la posizione di tutti i numeri e poi usare atoi a partire da quelle posizioni.
char string[] = "1,2,3"; int values[3] = { 0 }; int i = 0; int j = 0; while (string[i] != '\0' && j < 3) { while (string[i] != '+' && string[i] != '-' && !isdigit(string[i])) { if (string[i] == '\0') break; ++i; } values[j] = atoi(string + i); ++j; while (isdigit(string[++i])) { } /* skip the number */ } if (j != 3) { puts("Less than 3 numbers found."); return 1; } printf("%s = %d,%d,%d\n", string, values[0], values[1], values[2]);
4. Altre possibilità sono certamente possibili ma penso che questo sia sufficiente..
"apatriarca":
Ci sono parecchie alternative:
1. Fare uso di strtol al posto di atoi per la conversione. Questa funzione permette di ottenere un puntatore alla parte della stringa che rimane dopo aver letto il valore intero. Il codice diventa quindi il seguente (senza la verifica degli errori):
char string[] = "1,2,3"; char *p = string; char *end = string; int values[3] = { 0 }; for (int i = 0; i < 3; ++i) { values[i] = strtol(p, &end, 10); p = end+1; /* rimuovi virgola.. */ } printf("%s = %d,%d,%d\n", string, values[0], values[1], values[2]);
2. La seconda soluzione fa uso di (s)scanf ed è più semplice. La stringa di formato in questo caso è "%d,%d,%d" in quanto vuoi leggere tre numeri separati da virgole. Nota che nell'esempio uso sscanf perché leggo da stringa, ma se leggi da console hai bisogno di usare scanf e se è da file fscanf. In questo caso ho anche inserito come si verifica se sono stati letti tutti i numeri.
char string[] = "1,2,3"; int values[3] = { 0 }; int ret = sscanf(string, "%d,%d,%d", &values[0], &values[1], &values[2]); if (ret != 3) { fputs("ERROR: Invalid format.\n", stderr); return 1; } printf("%s = %d,%d,%d\n", string, values[0], values[1], values[2]);
3. Puoi fare una scansione della stringa per trovare la posizione di tutti i numeri e poi usare atoi a partire da quelle posizioni.
char string[] = "1,2,3"; int values[3] = { 0 }; int i = 0; int j = 0; while (string[i] != '\0' && j < 3) { while (string[i] != '+' && string[i] != '-' && !isdigit(string[i])) { if (string[i] == '\0') break; ++i; } values[j] = atoi(string + i); ++j; while (isdigit(string[++i])) { } /* skip the number */ } if (j != 3) { puts("Less than 3 numbers found."); return 1; } printf("%s = %d,%d,%d\n", string, values[0], values[1], values[2]);
4. Altre possibilità sono certamente possibili ma penso che questo sia sufficiente..
grazie mille,anche se inconsciamente io uso il secondo metodo,però usando %d pensando non fosse una lettura di stringhe!(invece lo era)