Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL debutta in Italia con il nuovo Tensor G6, lo Zoom Pro fino a 120x, il display Super Actua da 3600 nit e la new entry HiLight riservata ai modelli Pro: lo abbiamo provato in anteprima per diversi giorni prima del lancio commerciale, tra fotocamera generativa, ricarica ancora indietro rispetto ai rivali e un prezzo che parte da 1399 euro
Non sai programmare? Ecco cosa si può fare con un LLM e una GeForce RTX 5070 Ti
Non sai programmare? Ecco cosa si può fare con un LLM e una GeForce RTX 5070 Ti
Con un semplice dialogo in linguaggio naturale e la potenza di una scheda video di fascia alta è possibile costruire software funzionante da zero, senza scrivere una riga di codice e senza inviare un solo byte dei propri dati a server esterni
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Samsung rinnova la serie pieghevole di punta con Galaxy Z Fold8 Ultra: pannello interno da 8 pollici quasi senza piega, cerniera Flex Titanium, Snapdragon 8 Elite Gen 5 for Galaxy e batteria finalmente da 5.000 mAh. Prezzo italiano da 2.299 a 2.899 euro. Tra colorimetro, benchmark reali e giorni di uso quotidiano, ecco dove questo pieghevole convince e dove il nome Ultra fatica ancora a trovare piena giustificazione
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-07-2007, 15:07   #1
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
[C] problema strcpy ??

sto scrivendo una libreria per un progetto. Questa libreria, sostanzialmente, è composta da un set di funzioni che servono a gestire una lista ordinata.
Ho una funzione, lmake, che crea un nodo di questa lista riempiendo opportunamente i vari campi. Andando a provare, con un banale programma, queste funzioni mi sono accorto che proprio la più insospettabile, lmake appunto, non funziona. O meglio non inizializza alcuni campi come dovrebbe.

DEFINIZIONE NODO:

struct lnode{
char name[MAXB];
char pass[MAXB];
char pid[MAXB];
int stat;
struct pnode *pends;
struct lnode *next;
};
typedef struct lnode LNODE;

LMAKE:

LNODE *lmake(char *name,char *pass){
printf("%s %s\n",name,pass);
LNODE *x=(LNODE *)malloc(sizeof(LNODE));

strcpy(x->name,name);
strcpy(x->pass,name);
strcpy(x->pid,"");
x->stat=disconnesso;

x->pends=NULL;
x->next=NULL;
printf("%s %s\n",x->name,x->pass);
return x;
}

PROGRAMMA DI PROVA:

int main(){
LNODE *n1,*n2,*n3;
PNODE *t;
char buff[MAXB];

n1=lmake("nino","123");
n2=lmake("mara","456");
n3=lmake("poppy","789");


scanf("%s",buff);
return 0;
}

come si può vedere io mi faccio stampare, appena entra in lmake, i parametri che riceve (username e password). Mi faccio poi stampare i campi immediatamente prima che la funzione termini. L'output è assai strano:

nino 123
nn n
mara 456
mm m
poppy 789
pp p

in sostanza l'input è coerente, ma nel campo viene copiato qualcosa di diverso...e sono due ore che sbatto la testa su questo codice di 3 righe. Dopo un pò mi sono deciso a chiedere a chiunque abbia esperienza col C, perchè sicuro è una di quelle cazzate inumane che ignoro totalmente, e senza scusanti.

Vi ringrazio comunque per l'attenzione, anche se avrete letto solo le prime 3 righe

Ultima modifica di magagna : 12-07-2007 alle 15:38.
magagna è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 15:16   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da magagna Guarda i messaggi
in sostanza l'input è coerente, ma nel campo viene copiato qualcosa di diverso
A parte il fatto che copi il name nel campo pass. Ma per il resto quel pezzo di codice mi sembra corretto. Quanto vale MAXB?
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 15:20   #3
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
i due parametri di input della funzione, name e pass, vengono copiati rispettivamente in x->name e x->pass, o almeno questa sarebbe l'intenzione.

MAXB vale 15
magagna è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 15:26   #4
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
ho compilato e provato sia con gcc sotto Ubuntu, che con Dev-C++ sotto Windows e l'output è lo stesso...
magagna è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 15:50   #5
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
purtroppo sono una gran testa di C

avevi ragione a chiedermelo andbin, perchè ho sbagliato a scrivere MAXB. Io credevo fosse 15, in realtà avevo battuto solo 1.

Mea Culpa!

Ultima modifica di magagna : 12-07-2007 alle 15:53.
magagna è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 19:06   #6
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
un consiglio: butta via la strcpy e usa la strncpy:
strcnpy(x->name,name, sizeof(x->name));
strcpy(x->pass,pass, sizeof(x->pass));
/*strcnpy(x->pid,""); */ memset((void *) x->pid, 0, sizeof(x->pid))

il 3° parametro indica quanti caratteri al massimo copiare nel primo parametro

se usi la strcpy e MAXDB è definito = 15, se io faccio una cosa del genere
strcpy(x->name, "123456789123456789123456789")
vai pure tranquillo che sporchi memoria col rischio di segmentation fault o bachi semi-impossibili da trovare

__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 19:32   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da maulattu Guarda i messaggi
un consiglio: butta via la strcpy e usa la strncpy
Il consiglio è più che giusto ... però si dovrebbe copiare un carattere in meno e assicurarsi che ci sia sempre il nullo finale. malloc non azzera la memoria e facendo come hai detto tu è possibile che la stringa non sia null terminated.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 19:37   #8
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Quote:
Originariamente inviato da andbin Guarda i messaggi
Il consiglio è più che giusto ... però si dovrebbe copiare un carattere in meno e assicurarsi che ci sia sempre il nullo finale. malloc non azzera la memoria e facendo come hai detto tu è possibile che la stringa non sia null terminated.
Codice:
Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.

No null-character is implicitly appended to the end of destination, so destination will only be null-terminated if the length of the C string in source is less than num.
hai ragione
al più si fa un bel memset della stringa e poi ci si copia dentro l'altra, mettendo sempre lo 0 alla fine:
string[sizeof(string) - 1] = 0;

ps: io non ho parlato di malloc
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 19:50   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da maulattu Guarda i messaggi
ps: io non ho parlato di malloc
Io mi riferivo al codice di magagna che usa malloc per allocare la struttura. Se avesse usato calloc, ad esempio, il blocco sarebbe azzerato e quindi basterebbe fare
strncpy(x->name, name, sizeof(x->name)-1);
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2007, 19:39   #10
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Quote:
Originariamente inviato da andbin Guarda i messaggi
Io mi riferivo al codice di magagna che usa malloc per allocare la struttura. Se avesse usato calloc, ad esempio, il blocco sarebbe azzerato e quindi basterebbe fare
strncpy(x->name, name, sizeof(x->name)-1);
ok
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 23:48   #11
magagna
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 9
vi ringrazio per i suggerimenti, ragazzi
magagna è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship Google Pixel 11 Pro XL: fotocamera al top, batte...
Non sai programmare? Ecco cosa si può fare con un LLM e una GeForce RTX 5070 Ti Non sai programmare? Ecco cosa si può far...
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing" Insta360 X6: Dolby Vision, 8K e montaggio "...
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli Due settimane con Dacia Spring 2026: novit&agrav...
La missione per salvare il telescopio sp...
La stella S301 è così vici...
Chery accelera sulla robotica: Aimoga si...
Voigtländer Nokton 23mm e 35mm f/1....
Il Lunar Reconnaissance Orbiter della NA...
Prova a beffare il tribunale con un mess...
Pasticcio Freelander: usa l'immagine di ...
A New York apre la clinica del fondatore...
Control Resonant entra in fase Gold e ri...
HONOR Pad 20 Pro è ufficiale: un ottimo ...
Tesla Robotaxi sfonda dei dissuasori: il...
Call of Duty: Modern Warfare 4 presenta ...
Intel Arc più veloce fino al 5% s...
Il tuo ETF ha molta più NVIDIA di...
Il Fairphone Gen 6+ è ufficiale con un n...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:35.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v