[C] conversione da char a int

Messaggioda gaetano0 » 24/09/2017, 11:14

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 :| :|
gaetano0
Junior Member
Junior Member
 
Messaggio: 47 di 122
Iscritto il: 07/01/2017, 20:00

Re: [C] conversione da char a int

Messaggioda kobeilprofeta » 24/09/2017, 11:15

Prova
scanf ("%d%c%d%c%d");
kobeilprofeta
Cannot live without
Cannot live without
 
Messaggio: 2495 di 5262
Iscritto il: 24/09/2012, 18:25

Re: [C] conversione da char a int

Messaggioda gaetano0 » 24/09/2017, 11:22

kobeilprofeta ha scritto: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
gaetano0
Junior Member
Junior Member
 
Messaggio: 48 di 122
Iscritto il: 07/01/2017, 20:00

Re: [C] conversione da char a int

Messaggioda apatriarca » 24/09/2017, 19:23

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..
apatriarca
Moderatore
Moderatore
 
Messaggio: 4831 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] conversione da char a int

Messaggioda gaetano0 » 24/09/2017, 23:59

apatriarca ha scritto: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..







grazie mille,anche se inconsciamente io uso il secondo metodo,però usando %d pensando non fosse una lettura di stringhe!(invece lo era)
gaetano0
Junior Member
Junior Member
 
Messaggio: 49 di 122
Iscritto il: 07/01/2017, 20:00


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite