PROBLEMA Aiuto in c

Silvio HW

Utente Attivo
418
66
CPU
FX9590 @5GHZ
Dissipatore
THERMALRIGHT SILVER ARROW
Scheda Madre
SABERTOOTH 990FX REV.1
HDD
SSD 250GB WIN + 120 DATI
RAM
CORSAIR VEGANCE 4X4GB 1600MHZ CL9
GPU
SLI GTX 580 1536MB PHANTOM
PSU
CORSAIR RM1000I
Case
CORSAIR VEGANCE C70
OS
Windows 10 x64 ENTERPRISE
Ragazzi ho bisogno di aiuto riguardo un esercizio, non riesco nella pulizia da spazi di una stringa a distinguere i numeri double divisi da virgola,non ho la piu pallida idea di come fare..
la pulizia riesco a farla ma la distinzione no(vorrei distinguerli uno a uno per salvari in un array bidimensionale)
qualcuno ha un idea?? grazie mille:cry::cry::cry:
 

Andretti60

Utente Èlite
6,440
5,091
Sorry, non capisco assolutamente cosa tu intenda e quale sia il problema che devi risolvere.
Come da regolamento di sezione, esponi il problema chiaramente e posta il codice che hai scritto, anche se non completo e non funzionante.
 

Silvio HW

Utente Attivo
418
66
CPU
FX9590 @5GHZ
Dissipatore
THERMALRIGHT SILVER ARROW
Scheda Madre
SABERTOOTH 990FX REV.1
HDD
SSD 250GB WIN + 120 DATI
RAM
CORSAIR VEGANCE 4X4GB 1600MHZ CL9
GPU
SLI GTX 580 1536MB PHANTOM
PSU
CORSAIR RM1000I
Case
CORSAIR VEGANCE C70
OS
Windows 10 x64 ENTERPRISE
Sorry, non capisco assolutamente cosa tu intenda e quale sia il problema che devi risolvere.
Come da regolamento di sezione, esponi il problema chiaramente e posta il codice che hai scritto, anche se non completo e non funzionante.
praticamente acquisisco una stringa del tipo {1 ,6 ,4 ,7 } e devo eliminare i spazi e devo portare tutti i valori in array(max 100 elementi)
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
I vari numeri in base a cosa vengono divisi?
 
  • Mi piace
Reazioni: Silvio HW

Silvio HW

Utente Attivo
418
66
CPU
FX9590 @5GHZ
Dissipatore
THERMALRIGHT SILVER ARROW
Scheda Madre
SABERTOOTH 990FX REV.1
HDD
SSD 250GB WIN + 120 DATI
RAM
CORSAIR VEGANCE 4X4GB 1600MHZ CL9
GPU
SLI GTX 580 1536MB PHANTOM
PSU
CORSAIR RM1000I
Case
CORSAIR VEGANCE C70
OS
Windows 10 x64 ENTERPRISE
I vari numeri in base a cosa vengono divisi?[/
in base a delle virgole, quindi io per ogni numero nella stringa dovrei acquisirloe metterlo nell'array,quindi pensando ma se elimino gli spazi e le virgole e mi porto tuuta la stringa nell'array con un ciclo con i<strlen(la stringa pulita da cui pesco i dati) dovrebbe funzionare e elimino anche "/0" finale della stringa
e i numeri possono essere double quindi per esempio puo prendere in input anche{1.23 ,2.22 }
 

Silvio HW

Utente Attivo
418
66
CPU
FX9590 @5GHZ
Dissipatore
THERMALRIGHT SILVER ARROW
Scheda Madre
SABERTOOTH 990FX REV.1
HDD
SSD 250GB WIN + 120 DATI
RAM
CORSAIR VEGANCE 4X4GB 1600MHZ CL9
GPU
SLI GTX 580 1536MB PHANTOM
PSU
CORSAIR RM1000I
Case
CORSAIR VEGANCE C70
OS
Windows 10 x64 ENTERPRISE

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Devi usare la funzione sopra e l'atof(). Le sottostringhe le prendi iniziando da [0] e fermandoti alla successiva virgola ( o al \0 se arrivi alla fine) e avanti cosi
 

Silvio HW

Utente Attivo
418
66
CPU
FX9590 @5GHZ
Dissipatore
THERMALRIGHT SILVER ARROW
Scheda Madre
SABERTOOTH 990FX REV.1
HDD
SSD 250GB WIN + 120 DATI
RAM
CORSAIR VEGANCE 4X4GB 1600MHZ CL9
GPU
SLI GTX 580 1536MB PHANTOM
PSU
CORSAIR RM1000I
Case
CORSAIR VEGANCE C70
OS
Windows 10 x64 ENTERPRISE
Devi usare la funzione sopra e l'atof(). Le sottostringhe le prendi iniziando da [0] e fermandoti alla successiva virgola ( o al \0 se arrivi alla fine) e avanti cosi
io ora ho provato cosi e funziona

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
int loop;
char a[] = "1.22,8.36";

char * pch;
pch = strtok (a,",");
while (pch != NULL)
{
pch = strtok (NULL, ",");
}
return 0;
}

mi divide i numeri fra le virgole ora dovrei solo convertire il valore della var pch appena entra nel while e salvarlo nel vettore , che ne pensi?

uptdate
ho inserito la funzione strtod e inizializzato l'array dove vado a inserire i dati a 0 e sembra funzionare
"out[loop] = strtod(pch, NULL);"
 
Ultima modifica:

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
io ora ho provato cosi e funziona

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
int loop;
char a[] = "1.22,8.36";

char * pch;
pch = strtok (a,",");
while (pch != NULL)
{
pch = strtok (NULL, ",");
}
return 0;
}

mi divide i numeri fra le virgole ora dovrei solo convertire il valore della var pch appena entra nel while e salvarlo nel vettore , che ne pensi?

uptdate
ho inserito la funzione strtod e inizializzato l'array dove vado a inserire i dati a 0 e sembra funzionare
"out[loop] = strtod(pch, NULL);"
https://www.tutorialspoint.com/c_standard_library/c_function_atof.htm
 

Andretti60

Utente Èlite
6,440
5,091
La funzione strod (a parte permettere di passare il puntatore di fine stringa) è più robusta perché cattura errori di conversione tipo overflow (se il valore di ritorno è zero devi controllare la variabile "errno".
 

Silvio HW

Utente Attivo
418
66
CPU
FX9590 @5GHZ
Dissipatore
THERMALRIGHT SILVER ARROW
Scheda Madre
SABERTOOTH 990FX REV.1
HDD
SSD 250GB WIN + 120 DATI
RAM
CORSAIR VEGANCE 4X4GB 1600MHZ CL9
GPU
SLI GTX 580 1536MB PHANTOM
PSU
CORSAIR RM1000I
Case
CORSAIR VEGANCE C70
OS
Windows 10 x64 ENTERPRISE
La funzione strod (a parte permettere di passare il puntatore di fine stringa) è più robusta perché cattura errori di conversione tipo overflow (se il valore di ritorno è zero devi controllare la variabile "errno".
infatti ho notato questa cosa ma sembra funzionare tutto,putroppo è un esercitazxione per l'università quindi non posso usare ciò che voglio.:cav:
per ora sto cosi ,faccio l'arrotondamento del risulatto e ho fatto,ovviamente devo farlo apiu file c quindi quelle nel codice sono solo le funzioni che userò tramite il .h fatto da me

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
int i,loop,j,count=0;
char a[100] = "1.22 , 8.36, 3333333.666,80000 , 99999999999";
char b[100] = "1.22 , 8.36, 3333333.666,80000 , 99999999999";
double out_a[100] = {0};
double out_b[100] = {0};
char * pch;

for (i = 0; i<strlen(a); i++){ //funzione togli spazi
if (a != ' ')
a[count++] = a; //riscrivo il valore a nel a[cout] con count=n cella con dato
}

a[count] = '\0'; //finestringa pulita

pch = strtok (a,","); //funzione stringa pulita a array
for(loop=0;loop<strlen(a);loop++){
if(pch != NULL)
{
out_a[loop] = strtod(pch, NULL);
//printf ("%s\n",pch);
pch = strtok (NULL, ",");
}
}

double pr_sca[100] = {0}; //prodotto scalare fra i due array
for(j=0;j<100;j++){
pr_sca[j] = out_a[j] * out_b[j];
}


return 0;
}
 

Andretti60

Utente Èlite
6,440
5,091
Non funzionera' mai, ci sono troppi errori, ma prima converti il messaggio usando il tag 'code', in quella maniera e' illeggibile.
Cominciamo dal primo errore:
Codice:
if (a != ' ')
 
  • Mi piace
Reazioni: Mursey

Andretti60

Utente Èlite
6,440
5,091
Piccola nota: le funzioni strtod() e atof() utilizzano come separatore decimale il simbolo definito dal linguaggio usato nel tuo computer, a meno che lo hai definito come English il tuo separatore sarà la virgola, non il punto. Se vuoi usare un computer in italiano e il punto come separatore devi usare la funzione strtod_l() che ti permette di passare l'identificatore di un linguaggio specifico.
 
  • Mi piace
Reazioni: Silvio HW

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili