Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - aiuto non mi fa inserire la stringa!!
Forum - C/C++ - aiuto non mi fa inserire la stringa!!

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
DarkPoker97 (Normal User)
Newbie


Messaggi: 3
Iscritto: 01/01/2015

Segnala al moderatore
Postato alle 17:04
Giovedì, 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;    
    
}

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 17:12
Giovedì, 01/01/2015
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

PM Quote
Avatar
DarkPoker97 (Normal User)
Newbie


Messaggi: 3
Iscritto: 01/01/2015

Segnala al moderatore
Postato alle 14:22
Venerdì, 02/01/2015
grazie, si ho provato ma mi dice che il main.cpp ha smesso di funzionare..

PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 16:06
Venerdì, 02/01/2015
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++

  1. cout<<"Inserisci lunghezza massima della stringa : ";
  2. cin>>lm;
  3. 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

  1. char* str;
  2. cout<<"Inserisci lunghezza massima della stringa : ";
  3. cin>>lm;
  4. 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
PM Quote
Avatar
DarkPoker97 (Normal User)
Newbie


Messaggi: 3
Iscritto: 01/01/2015

Segnala al moderatore
Postato alle 16:22
Venerdì, 02/01/2015
salve, grazie della risposta ho fatto quello che lei mi ha detto ma il programma smette di funzionare quando lo eseguo

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6380
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:45
Venerdì, 02/01/2015
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à.
PM Quote
Avatar
SamIAm (Normal User)
Newbie


Messaggi: 16
Iscritto: 09/09/2012

Segnala al moderatore
Postato alle 16:45
Venerdì, 02/01/2015
Usa la classe string del C++.

Ultima modifica effettuata da SamIAm il 02/01/2015 alle 16:46
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 17:26
Venerdì, 02/01/2015
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++

  1. size_t lunghezzaMassima, lunghezzaAttuale;
  2. char* stringa;
  3.  
  4. cout << "Lunghezza massima della stringa: ";
  5. cin >> lunghezzaMassima;
  6.  
  7. stringa = new char[lunghezzaMassima + 1];
  8. memset(stringa, 0, lunghezzaMassima + 1);
  9. gets(stringa);
  10. lunghezzaAttuale = strlen(stringa);


PM Quote
Avatar
SamIAm (Normal User)
Newbie


Messaggi: 16
Iscritto: 09/09/2012

Segnala al moderatore
Postato alle 17:31
Venerdì, 02/01/2015
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
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo