Aiutino con stringhe C++.. AIUTO!!
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
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
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:
e salvi in un file e lo chiami per es. "mylib.h"
utilizzabile come segue:
ovviamente e' tutto da verificare.
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.
Se sei in C++, e' consigliabile usare cout.
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
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)
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; }
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!!
"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
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...
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; }
Thanks a lot.. ora lo provo.. vi faccio sapere al più presto.. grazie grazie grazie...
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
POL
Prego
... dai un occhio al link che ti ha suggerito TomSawyer trovi tutti i metodi della classe string
