Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250

    [C/C++]Di nuovo i dilemmi dei puntatori..allocazione

    Ciao ragazzi!Come da titolo vi sottopongo nuovamente un quesito .
    Faccio prima ad esemplificare il tutto...in pratica la mia situazione è questa:
    codice:
     
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    char* fun1(char parola[]);
    
    int main()
    {
        char frase[10];
        char *p;
        printf("Inserisci la frase ");
       gets(frase);
        p = fun1(frase);
        
    }
    char* fun1(char parola[])
    {
        int i;
        char* ritorno=new char (strlen(parola));
        for (i = 0;parola[i]!='\0';i++)
            if ((parola[i]>='a') && (parola[i]<='z'))
               ritorno[i]=parola[i]-(char) 32;
            else
               ritorno[i] = '*';
    
            return ritorno;
    }
    Eseguendo il codce con il debug,quando vado all'interno della fun1,noto che nella variabile char ritorno di tipo puntatore ci sono più caratteri rispetto al numero di caratteri formanti la parola in ingresso.
    Dato che ho fatto new char (strlen(parola))...il puntatore ritorno non dovrebbe contenere solo al massimo strlen(parola) caratteri?
    Grazie per le risposte . .

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Come saprai una stringa in C deve prevedere il terminatore null.

    Quindi nella new devi prevedere il valore

    [strlen(parola)+1]

    e il NULL deve essere copiato nell'ultimo carattere della stringa ritorno (cosa che non fai).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3

    Re: [C/C++]Di nuovo i dilemmi dei puntatori..allocazione

    Hai fatto cinque grossi errori:
    1. new char (strlen(parola)) è sbagliato, questo alloca un singolo char e lo inizializza con strlen(parola) (convertito in un char); nel codice che segue quindi stai sforando abbondantemente dal buffer allocato (cosa che può essere apparentemente indolore, come in questo caso, o portare a crash casuali); quello che intendevi scrivere è new char [strlen(parola)];
    2. ... ma è comunque sbagliato, devi prevedere un carattere in più per il carattere '\0' finale; quindi dovrà essere new char[strlen(parola)+1];
    3. in fun1 non termini la stringa "ritorno" con il '\0', motivo per cui in debug vedi più caratteri di quanti ce ne siano: il debugger va avanti a leggere finché non trova un '\0' che per caso si trova lì.
    4. Nel main non deallochi la memoria restituita da fun1;
    5. Mai usare la gets, l'utente può inserire quanti caratteri gli pare e sforare dal tuo buffer; piuttosto, fgets.

    Un abbozzo di correzione potrebbe essere:
    codice:
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    char* fun1(char parola[]);
    
    int main()
    {
        char frase[10];
        char *p;
        printf("Inserisci la frase ");
        fgets(frase, sizeof(frase), stdin);
        // fgets acquisisce anche il newline finale, rimuovilo se credi
        p = fun1(frase);
        delete[] p;
        return 0;    
    }
    char* fun1(char parola[])
    {
        int i;
        char* ritorno=new char[strlen(parola)+1];
        for (i = 0;parola[i]!='\0';i++)
            if ((parola[i]>='a') && (parola[i]<='z'))
                ritorno[i]=parola[i]-(char) 32;
            else
                ritorno[i] = '*';
        ritorno[i]=0;
        return ritorno;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Grazie davvero per avermi risposto..grazie ancora per avermi spiegato le motivazioni ma anche per avermi fatto notare i miei numerosi errori D:
    I caratteri terminatori della stringa proprio non li calcolavo seppure sapessi che esistessero...adesso si spiega il perchè alcune volte mi apparivano risultati strani.
    Riguardo alla deallocazione...beh è vero mi sono dimenticato

    Come al solito non deludete mai COMPLIMENTI

  5. #5
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    Diciamo che un modo alternativo è quello di usare sprintf,per forzare l'aggiunta dello zero, giustapponendolo a un %s

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Diciamo che un modo alternativo è quello di usare sprintf,per forzare l'aggiunta dello zero, giustapponendolo a un %s
    Frena,frena..non ti seguo..

  7. #7
    Se è per quello non ho ben capito neanch'io... la sprintf con lo specificatore "%s" vuole comunque una stringa già terminata...
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Se è per quello non ho ben capito neanch'io...
    lol

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.