|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2005
Città: NAPOLI
Messaggi: 648
|
[C] Comportamento strano con allocazione dinamica stringhe!HELP!!!
Salve ragazzi sto incontrando nell stasera di un programmino che riceve in input una stringa e la memorizza dinamicamente, poi la copia con una memcpy in un altra stringa.
#include <stdio.h> #include<string.h> #include <stdlib.h> void main () { char *Pstringa; char *STRINGA; int a; Pstringa = malloc( _MAX_PATH ); puts("scrivi caratteri: "); gets(Pstringa); puts("la stringa e': "); printf("%s\n",Pstringa); puts("la stringa memorizzata con 'memcpy' e': "); a=strlen(Pstringa); STRINGA=malloc(a); memcpy(STRINGA,Pstringa,a); printf("%s\n",STRINGA); puts("la stringa memorizzata con 'memmove' e': "); memmove(STRINGA,Pstringa,a); printf("%s\n",STRINGA); system("pause"); } L'output del programma è il seguente: scrivi caratteri: valerio la stringa e': valerio la stringa memorizzata con 'memcpy' e': valerio²²²² la stringa memorizzata con 'memmove' e': valerio²²²² Premere un tasto per continuare . . . non mi riesco a rendere conto perche in seguito alla memcpy e alla memmove la stringa mi compare "sporcata " da quei 4 caratteri finali....graiz per la cortese attenzione
__________________
O'Napule dint'o'core.......... -MacBook 2,26 GHz Intel Core 2 Duo - 4 GB DDR3 -IPhone 3GS 16 GB -Ipad wifi+3g 64gb |
![]() |
![]() |
![]() |
#2 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
strlen non conta il carattere nullo finale, quindi, se a=strlen(Pstringa), per allocare spazio sufficiente a contenere una copia di Pstringa devi chiamare malloc(a+1).
Altrimenti, la memoria copiata contiene sì i caratteri di Pstringa prima del NUL, ma la zona successiva contiene un po' di monnezza, più (si spera!) un carattere nullo prima o poi. Ah: e main deve essere di tipo int.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 10-05-2007 alle 13:55. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2005
Città: NAPOLI
Messaggi: 648
|
facendo come dici tu cmq non esce il risultato sperato infatti l'output guarda com'è:
scrivi caratteri: valerio la stringa e': valerio la stringa memorizzata con 'memcpy' e': valerio═²²²² la stringa memorizzata con 'memmove' e': valerio═²²²² Premere un tasto per continuare . . . mi aggiunge un "="....io credo che allochi più memoria di quanto ne serva ma non riesco a capire il perchè.
__________________
O'Napule dint'o'core.......... -MacBook 2,26 GHz Intel Core 2 Duo - 4 GB DDR3 -IPhone 3GS 16 GB -Ipad wifi+3g 64gb |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
O imposti tu il nullo o usi strcpy().
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2005
Città: NAPOLI
Messaggi: 648
|
quindi nel codice cosa devo cambiare....fammi capire....scusa...grazie
__________________
O'Napule dint'o'core.......... -MacBook 2,26 GHz Intel Core 2 Duo - 4 GB DDR3 -IPhone 3GS 16 GB -Ipad wifi+3g 64gb |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
O fai (dopo la memcpy): STRINGA[a] = '\0'; oppure usi strcpy (che come da specifiche, copia anche il nullo).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2005
Città: NAPOLI
Messaggi: 648
|
grazie mille....ho capito il perchè
__________________
O'Napule dint'o'core.......... -MacBook 2,26 GHz Intel Core 2 Duo - 4 GB DDR3 -IPhone 3GS 16 GB -Ipad wifi+3g 64gb |
![]() |
![]() |
![]() |
#8 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
![]() E sì che bastava suggerire di riscrivere a=strlen(Pstringa)+1 ![]()
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:57.