|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
invertire una stringa contenente spazi...con ciclo di ritorno!
Ciao ragazzi!
Mi sono messa a tentare qualcosina con il C. Quel che mi interessa fare, è un programmino che, data in input una stringa, me la inverta in output; e poi chieda se voglio invertire qualcos'altro e, nel caso, ricominci. In pratica, vorrei che, dando mi chiamo angelica mi venga restituito acilegna omaihc im Ora, io ho scritto il seguente programmino: Codice:
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define max 255
main()
{
char testo[max], risp[max];
void Inverti (char *);
risp[0] = 's';
while(risp[0] == 's')
{
system("cls");
printf("Immetti una stringa di testo da invertire: \n");
scanf("%s",testo); /* gets(testo); */
Inverti(testo);
printf("\n\nLa stringa invertita e':\n");
puts(testo);
printf("\n\nVuoi invertire un'altra stringa? (s/n) : ");
scanf("%s",risp);
while(risp[0] != 'n' && risp[0] != 's')
{
printf("\nrisposta non accettabile! digita per favore s/n : ");
scanf("%s",risp);
}
}
}
void Inverti (char *s)
{
int c;
char *p = s;
for (p += strlen(s) - 1; p > s; p--, s++)
c = *s, *s = *p, *p = c;
}
![]() La colpa è dello scanf, che prende lo spazio come un termina stringa, penso. Ho provato allora con il gets che vedete nel codice come commento, al posto del primo scanf...il risultato è che la prima inversione me la fa: ![]() Ma quando gliene chiedo un'altra, va direttamente ancora al ciclo di richiesta altra inversione... ![]() Forse è il gets, ma non capisco perché... Non è che qualcuno riesce a darmi una mano? Ci sto sbattendo la testa da un po', ma non riesco a venirne fuori! L'eseguibile del programmino lo potete scaricare qui (tasto dx mouse -> salva con nome). Davvero grazie!!
__________________
ANGI Ultima modifica di angelica : 15-11-2003 alle 16:07. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
prima di tutto un consiglio. invece di gets usa fgets:
Codice:
char *fgets(char *s, int size, FILE *stream); il programma salta l'inserimento delle frasi successive perchè un carattere di infio viene lasciato nel buffer e interpretato dal c come il prossimo inserimento da tatsiera dell'utente. ciao |
|
|
|
|
|
#3 | ||
|
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
Quote:
allora, ho provato col tuo consiglio. ho sostituito a gets(testo) fgets(testo,max-1,stdin), ma il comportamento è sempre il solito, al secondo tentativo di inversione: ![]() stessa cosa se metto fgets(testo,strlen(testo),stdin) (non so comunque se è corretto chiamare strlen lì) Non ci sarebbe modo di "dire" a scanf di considerare lo spazio come un carattere? Quote:
Caspita, mi sembrava un proggie così semplice, e invece mi sono impantanata... Se puoi darmi una mano, ti ringrazio davvero! Tanto il codice l'ho postato! Grazie!!
__________________
ANGI Ultima modifica di angelica : 15-11-2003 alle 21:11. |
||
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
ho provato a togliere un '\n' dall'array di input...ma forse tu non intendevi quello, parlando di buffer...?
ho implementato una funzione "togli" Codice:
void togli (char *p)
{
while (*p && *p != '\n') p++;
*p = '\0';
}
Codice:
(...)
printf("Immetti una stringa di testo da invertire: \n");
fgets(testo,max-1,stdin);
togli(testo);
inverti(testo);
![]() Mi toglie giustamente il "new line" prima di invertire...ma tutto lì... grazie per l'aiuto!
__________________
ANGI Ultima modifica di angelica : 15-11-2003 alle 21:23. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
premessa: ho provato a capire cosa c'era che non andava nel tuo codice, davvero... però dato che non amo la sintesi estrema nella scrittura di codice a scapito della leggibilità, ho preferito riscrivere il tutto...
Codice:
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <string.h>
#define max 255
void Inverti(const char *originale, char* invertita);
void main()
{
char input[max],
output[max];
do
{
// svuoto i buffer
input[0] = output[0] = '\0';
// stampo la "gui"
system("cls");
printf("Immetti una stringa di testo da invertire: \n");
// immissione del testo ed elaborazione
gets(input);
Inverti(input, output);
// stampa output e richiesta operazione
printf("\nLa stringa invertita e':\n");
puts(output);
printf("\nVuoi invertire un'altra stringa? (s/n) : ");
}
while(getch() != 'n');
}
void Inverti(const char *originale, char* invertita)
{
for(int i = strlen(originale) - 1; i >= 0; i--)
*invertita++ = *(originale + i);
*invertita = '\0'; // terminatore di stringa
}
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
|
io ricordo che per risolvere problemi simili mettevo delle getchar in modo da leggere i caratteri di "a capo" per essere pronto a leggere una nuova linea.
qualcosa tipo while (getchar() == '\n') cmq ormai sono entrato completamente nel mondo Java quindi non mi capitano più questi problemi |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Ecco perchè il C++ allunga la vita
Codice:
#include <stdio.h>
#include <iostream.h>
#include <sstream>
#include <string>
#include <algorithm> // per reverse:funziona su tutti i containers
using namespace std;
main()
{
cout<<"Scrivi la stringa"<<'\n';
stringstream sstream;
char c;
//il carattere End Of File dalla tastiera è Ctrl+z
while((c=cin.get())!=EOF) sstream<<c;
//estrae la string dallo string stream
string reverted=sstream.str();
//la capovolge
reverse(reverted.begin(),reverted.end());
cout<<reverted;
getchar();
}
In questo modo puoi scrivere anche tutta la Divina Commedia senza buffer overflow Ultima modifica di verloc : 16-11-2003 alle 07:12. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
dai si sa che le stl sono un universo avanti... il problema era da risolvere in C
|
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Codice:
fgets (testo, max, stdin); Quote:
ciao |
||
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Quote:
Ma allora vi volete fare proprio male ! Masochisti! Ciao |
|
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
Quote:
Hai provato a tentare di correggerlo? Ora provo un po' a guardare quel che ha scritto "ri"... Ah, ragazzi, dato che ormai mi è venuta la fissa, e il C++ è molto più potente...potete consigliarmi un ottimo posto dove trovare delle risorse? Considerate che le basi della programmazione le ho già!
__________________
ANGI |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Quote:
Senza dubbio da quà. http://www.icce.rug.nl/documents/cplusplus/ e scarica questo: (ti servirà credimi) http://www.fz-juelich.de/zam/cxx/cxxkurs.pdf ha una reference della STL string meravigliosa oltre a tantissime altre cose Ultima modifica di verloc : 16-11-2003 alle 16:49. |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
Quote:
__________________
Gnu/Linux User
|
|
|
|
|
|
|
#14 | |
|
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
Quote:
grazie, ri...ho scoperto dove era il problema...non nei vari fgets, gets e compagnia bella...ma nella richiesta finale di un'altra inversione...evidentemente c'è qualcosa che non va nel vettore risp o nello scanf della risposta che si interfaccia col gets del ciclo...non so... comunque, fgets o gets van bene entrambi...col do while con il getch finale, ho risolto...pensa te! (il getchar mi dava probs perché accetta più di un carattere...) ti ringrazio...e mi do al C++! bel forum, però, non pensavo di ricevere tanti commenti e aiuti! di certo mi rifarò sentire con i miei problemi!! ciau! ora vi posto il codice finale del programmino: Codice:
#include .....
#define max 255
void inverti(char *);
main()
{
char testo[max];
int c;
do
{
system("cls");
printf("Immetti una stringa di testo da invertire: \n");
gets(testo);
inverti(testo);
printf("\n\nLa stringa invertita e':\n");
puts(testo);
printf("\n\nVuoi invertire un'altra stringa? (s/altro) : ");
}
while((c = getch()) == 's' || c == 'S');
}
void inverti (char *s)
{
int c;
char *p = s;
for (p += strlen(s) - 1; p > s; p--, s++)
c = *s, *s = *p, *p = c;
}
__________________
ANGI |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:19.























