DarkPoker97 (Normal User)
Newbie
Messaggi: 3
Iscritto: 01/01/2015
|
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=str[j];
j++;
if(j==lm+1)j=0;
}
for(i=0;i<lm;i++){
cout<<str;
}
delete [] str;
}
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
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
|
|
DarkPoker97 (Normal User)
Newbie
Messaggi: 3
Iscritto: 01/01/2015
|
grazie, si ho provato ma mi dice che il main.cpp ha smesso di funzionare..
|
|
tuttodiMC (Normal User)
Expert
Messaggi: 327
Iscritto: 29/10/2012
|
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
Codice sorgente - presumibilmente C/C++ |
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:
Codice sorgente - presumibilmente Plain Text |
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 il 02/01/2015 alle 16:10 |
|
DarkPoker97 (Normal User)
Newbie
Messaggi: 3
Iscritto: 01/01/2015
|
salve, grazie della risposta ho fatto quello che lei mi ha detto ma il programma smette di funzionare quando lo eseguo
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6380
Iscritto: 03/01/2010
|
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à. |
|
SamIAm (Normal User)
Newbie
Messaggi: 16
Iscritto: 09/09/2012
|
Usa la classe string del C++.
Ultima modifica effettuata da SamIAm il 02/01/2015 alle 16:46 |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
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 ?
Codice sorgente - presumibilmente C/C++ |
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);
|
|
|
SamIAm (Normal User)
Newbie
Messaggi: 16
Iscritto: 09/09/2012
|
Si, la gets() "fa schifo" , è una delle tante funzioni deprecate, perché a forte rischio buffer-overrrun
molto meglio usare la fgets(), se proprio ci si vuole ostinare ad usare le stringhe in stile C.
Ultima modifica effettuata da SamIAm il 02/01/2015 alle 17:32 |
|