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):
- Codice:
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.
- Codice:
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.
- Codice:
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..