Oppure

Loading
01/01/15 16:04
DarkPoker97
il resto funziona correttamente, ma quando eseguo questo programma mi salta l'inserimento della stringa dinamica


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

using namespace std;

int main() {
    
    int lm, le, dl, i, j=0; //lm=lunghezza massima---le=lunghezza effettiva---dl=differenza lunghezze
    char* str;
    
    str=new char[lm];

    cout<<"Inserisci lunghezza massima della stringa : ";
    cin>>lm;

cout<<endl;    

    cout << "Inserire stringa : "; //salta questo passaggio
cin.getline(str,200);

    cout<<endl;


        
    
    le=strlen(str);
    
    dl=lm-le;
    
    cout<<"La differenza tra la lunghezza massima e la lunghezza effettiva è: "<<dl<<endl;
    
    for(i=le;i<lm;i++){
        str[i]=str[j];
        j++;
        if(j==lm+1)j=0;        
    }
    
    for(i=0;i<lm;i++){
        cout<<str[i];
    }
        
    delete [] str;    
    
}
aaa
01/01/15 16:12
TheDarkJuster
Hai provato a fare in modo che l'utente possa specificare la lunghezza della stringa PRIMA di allocare la memoria? Perchè secondo me quel new char[lm]; con lm che varia DOPO aver fatto new[] non è una buona cosa
aaa
02/01/15 13:22
DarkPoker97
grazie, si ho provato ma mi dice che il main.cpp ha smesso di funzionare..
aaa
02/01/15 15:06
tuttodiMC
Il problema è che non è chiara la sintassi per la dichiarazione di una stringa. Devi decidere tra due possibilità, o come array o come puntatore. L'effetto è lo stesso ma base a quella che scegli dovrai adottare una sintassi diversa nella fase di dichiarazione ed inizializzazione;

Se decidi di utilizzarla come array ti basta far inserire prima lm e poi dichiari l'array in questo modo

cout<<"Inserisci lunghezza massima della stringa : ";
cin>>lm;
char str[lm]; 


Da notare che la dichiarazione dell'array in C++ può essere fatta nel corpo del programma e non per forza all'inizio come insegnano alcuni.

Nel caso invece tu decidessi (come hai già fatto) di utilizzare un puntatore, dovresti ricorrere all'allocazione dinamica della memoria quindi ti troverai a dover utilizzare la funzione malloc(). Esempio:

char* str;
cout<<"Inserisci lunghezza massima della stringa : ";
cin>>lm; 
str = (char*)malloc(sizeof(char) * lm);


e in questo modo avresti la tua stringa tramite puntatore.

La tua dichiarazione e inizializzazione provoca un problema: utilizzi la variabile lm che all'inizio non ha un valore da te stabilito, e quindi ne possiede uno casuale assegnato dal compilatore, per stabilire la dimenzione di un array/puntatore.

Secondo me devi creare la stringa in maniera differente. Hai pensato di utilizzare il tipo string includendo la libreria cstring.h (non string.h)?
Potrebbe risolvere il tuo problema secondo me
Ultima modifica effettuata da tuttodiMC 02/01/15 15:10
aaa
02/01/15 15:22
DarkPoker97
salve, grazie della risposta ho fatto quello che lei mi ha detto ma il programma smette di funzionare quando lo eseguo
aaa
02/01/15 15:45
nessuno
Cioè? Adesso che hai scritto esattamente?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
02/01/15 15:45
SamIAm
Usa la classe string del C++.
Ultima modifica effettuata da SamIAm 02/01/15 15:46
aaa
02/01/15 16:26
TheDarkJuster
usare una variabile per definire la dimensione dell'array che varia a runtime E' MOLTO MALE, o malloc o dimensione fissa. Comunque ti fa schifo usare gets ?

size_t lunghezzaMassima, lunghezzaAttuale;
char* stringa;

cout << "Lunghezza massima della stringa: ";
cin >> lunghezzaMassima;

stringa = new char[lunghezzaMassima + 1];
memset(stringa, 0, lunghezzaMassima + 1);
gets(stringa);
lunghezzaAttuale = strlen(stringa);
aaa