Aiutino con stringhe C++.. AIUTO!!

Paolo902
Ciao a tutti! Scusate il disturbo.. ma avrei bisogno di un piccolo aiutino in C++...
Sto muovendo ancora i primi passi, non sono un programmatore espertissimo e dunque mi rivolgo a voi grandi guru della programmazione.. Devo costruire un programma (o meglio una function di un programma) che riceva in ingresso una stringa e la mostri scritta in verticale (ovviamente, il tutto gira su una console Linux, o per utenti Windows, sul vecchio prompt ms dos).
Supponiamo che la stringa sia predefinita, tramite un'istruzione di assegnamento, e sia "Questa è una stringa in C++": il codice sarebbe il seguente

#include

void testo()
{
char *stringa = "Questa e' una stringa in C++";
int i = 0;

while (*(stringa + i) != '\0')
{
printf("%c\n", *(stringa + i));
i++;
}
}


Risulta necessario l'uso del puntatore, per gestire l'allocazione di memoria di ogni singolo carattere della stringa; al tempo stesso, c'è bisogno di un ciclo while che continui fino a che il puntatore non raggiunge l'ultimo posto della stringa (che è occupato dalla "sequenza di escape" \0). L'output è (incredibile a dirsi) quello desiderato: ogni carattere su una riga.

Il mio problema, signori, la domanda che vi pongo è: come posso fare la stessa cosa con un'altra stringa, che però non è predefinita ma definita dall'utente in input? (ovviamente pongo delle condizioni di lunghezza massima, per ovvie ragioni di memoria....)

Come al solito.. GRAZIE a chi risponderà.

Saluti Pol

Risposte
eugenio.amitrano
non occorre un puntatore dinamico, basta dichiarare un puntatore stringa come parametro per renderlo costante nella funzione.

Per esempio, la funzione stampa potrebbe essere questa:
#include <...

void stampa_verticale(char *stringa)
{
   int i = 0;

   while(stringa[i] != '\0')
   {
      printf("%c\n", stringa[i]);
      i++;
   }
}

e salvi in un file e lo chiami per es. "mylib.h"
utilizzabile come segue:

#include <...
#include "mylib.h"

#define MAX 1000

void main()
{
   char frase[MAX];

   printf("Inserisci una frase: ");
   gets(frase);
   stampa_verticale(frase);
}


ovviamente e' tutto da verificare.

TomSawyer1
Se sei in C++, e' consigliabile usare cout.

Paolo902
Sì, grazie a entrambi...grazie TomSawyer per il consiglio...comunque Eugenio, l'idea è buona ma la funzione non gira.. anzitutto il compilatore mi dà un warning: " /math.cpp:170: warning: the gets function is dangerous and should not be used. ( non so perchè..).. va detto che che io non ero a conoscenza di questo sistema di input.. sapevo solo il classico cin >> " " ; che però non funziona con le stringhe... cmq mi viene fuori il messaggio "Inserisci una frase" ma dopo averla digitata do invio e l'esecuzione del programma termina lì... che fare????? aiuto ancora una volta... scusatemi... I need your help!! Thanks Pol

beppe86
Mi sembra strano che non ti gira quello suggerito da Eugenio... cmq sia ho buttato giù velocemente questa bozza e funziona, ho messo funzione e main nel solito file per comodità.
Quoto quanto detto da TomSawyer sull'uso del cout (e quindi anche del cin)

#include<iostream.h>
const MAX=100;

void scrivi_verticale(char *stringa)
{
 int i=0;
 while(stringa[i]!='\0')
 {
  cout<<stringa[i]<<"\n";
  i++;
 }
}

int main()
{
 char input[MAX];
 cout<<"Inserisci frase ";
 cin>>input;
 scrivi_verticale(input);
 return 0;
}

Paolo902
Questo gira.. il problema è che se io scrivo " Hello " lo scrive in verticale ma non accetta frasi del tipo " Hello. My name is Paul": in tal caso infatti scrive solo "Hello" in verticale e poi in corrispondenza dello spazio si arresta.. Potrei ovviare a tale inconveniente scrivendo " Hello._My_name_is_Paul". Ma non si può fare in altro modo? Io credo che il problema sia sul "cin".. il problema è che non so usare nè gets nè getline..cmq vi ringrazio tutti per l'aiuto... GRAZIE!!

beppe86
"Paolo90":
Questo gira.. il problema è che se io scrivo " Hello " lo scrive in verticale ma non accetta frasi del tipo " Hello. My name is Paul": in tal caso infatti scrive solo "Hello" in verticale e poi in corrispondenza dello spazio si arresta.. Potrei ovviare a tale inconveniente scrivendo " Hello._My_name_is_Paul". Ma non si può fare in altro modo? Io credo che il problema sia sul "cin".. il problema è che non so usare nè gets nè getline..cmq vi ringrazio tutti per l'aiuto... GRAZIE!!


Il problema sta nella condizione del ciclio while... infatti si ferma quando trova "\0" vale a dire il carattere bianco.
Cmq potresti tagliare la testa al toro usando proprio il tipo string, che non è un tipo di base del c++ ma funziona molto bene... poi non so se è un esercizio di scuola che devi fare per forza con i char

Paolo902
no no non è un esercizio di scuola.. magari a scuola facessimo 'ste cose!! Sto studiando il C++ da solo, da autodidatta... Comunque, ho capito... è sbagliata la condizione del ciclo while... ma tu cosa suggerisci di fare con il tipo string? So che non è un tipo base del C++ ma non so usarlo... grazie ancora...

TomSawyer1
#include <string>
using namespace std;


E una lista delle semplici e utili funzioni e' questa.

beppe86
Usando il tipo string il programma viene semplicemente
#include<iostream>
#include<string>
using namespace std;

void scrivi_verticale(string frase)
{
 int i=0;
 while(i<frase.length()) //length metodo predefinito per calcolare la lunghezza della stringa
 {
  cout<<frase[i]<<"\n";
  i++;
 }
}

int main()
{
 string input;
 cout<<"Inserisci frase: ";
 getline(cin,input); //per memorizzare tutta la riga spazi compresi bisogna usare il getline
 scrivi_verticale(input);
 system("PAUSE");
 return 0;
}

Paolo902
Thanks a lot.. ora lo provo.. vi faccio sapere al più presto.. grazie grazie grazie...

Paolo902
Eccezionale!!! GRAZIE A TUTTI! Grazie Beppe86.. gira tutto benissimo... non sapevo come si usava il getline... ora invece grazie a te l'ho imparato... grazie ancora... a presto... bye bye
POL

beppe86
Prego :wink:... dai un occhio al link che ti ha suggerito TomSawyer trovi tutti i metodi della classe string

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.