Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marathon: arriva il Fortnite hardcore
Marathon: arriva il Fortnite hardcore
Marathon è il titolo multiplayer competitivo del momento. Ecco quali sono le caratteristiche di gioco principali, insieme alle nostre prime considerazioni dopo qualche "run" nell'extraction shooter di Bungie
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-11-2003, 16:02   #1
angelica
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;
}
Solo che non funziona come vorrei, se trova uno spazio, tronca l'inversione:



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.
angelica è offline   Rispondi citando il messaggio o parte di esso
Old 15-11-2003, 17:16   #2
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
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 motivo è che gets non controlla se la stringa in ingresso è piu grande dell'array di destinazione. questo puo portare a dei buffer overflow, problemi di sicurezza e tanti bei crash.

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
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 15-11-2003, 20:27   #3
angelica
Member
 
Iscritto dal: Nov 2003
Messaggi: 42
Quote:
Originariamente inviato da VICIUS
prima di tutto un consiglio. invece di gets usa fgets:
Codice:
char *fgets(char *s, int size, FILE *stream);
il motivo è che gets non controlla se la stringa in ingresso è piu grande dell'array di destinazione. questo puo portare a dei buffer overflow, problemi di sicurezza e tanti bei crash.[/b]
grazie per la spiegazione...mi puoi aiutare a far andare il proggie? ti prego!

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:
il programma salta l'inserimento delle frasi successive perchè un carattere di invio viene lasciato nel buffer e interpretato dal c come il prossimo inserimento da tastiera dell'utente.
Quindi, secondo te, risolverei togliendo quel carattere dal buffer...? Sinceramente, non ho idea di come fare...
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.
angelica è offline   Rispondi citando il messaggio o parte di esso
Old 15-11-2003, 21:09   #4
angelica
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'; 
}
e, nel main(), chiamo "togli" prima di "inverti"

Codice:
(...)
printf("Immetti una stringa di testo da invertire: \n"); 
fgets(testo,max-1,stdin);
togli(testo);
inverti(testo);
...Nulla da fare...cambia però una cosa: alla seconda stringa da invertire, ho questa schermata:



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.
angelica è offline   Rispondi citando il messaggio o parte di esso
Old 15-11-2003, 21:51   #5
ri
Senior Member
 
L'Avatar di ri
 
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
}
ri è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2003, 00:17   #6
recoil
Senior Member
 
L'Avatar di recoil
 
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
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2003, 07:09   #7
verloc
Senior Member
 
L'Avatar di verloc
 
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.
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2003, 09:06   #8
ri
Senior Member
 
L'Avatar di ri
 
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
ri è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2003, 09:16   #9
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da angelica
[...] ho sostituito a gets(testo) fgets(testo,max-1,stdin), ma il comportamento è sempre il solito, al secondo tentativo di inversione:
[...]
il parametro "int size" di fgets indica alla funzione il massimo elemento dell'array che puo scrivere senza andare ad invadere in altre aree di memoria. quindi il modo giusto di chiamare fgets è:
Codice:
fgets (testo, max, stdin);
Quote:
Originariamente inviato da angelica
[...] stessa cosa se metto
fgets(testo,strlen(testo),stdin)
(non so comunque se è corretto chiamare strlen lì) [...]
qui usare strlen è sbagliato. la funzione ritorna il numero di caratteri da cui è composta la stringa. se la stringa fosse stata vuota (un carattere '\0' nel primo elelmento) non avresti letto niente in ingresso.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2003, 10:07   #10
verloc
Senior Member
 
L'Avatar di verloc
 
Iscritto dal: Jan 2000
Messaggi: 551
Quote:
Originariamente inviato da ri
dai si sa che le stl sono un universo avanti... il problema era da risolvere in C

Ma allora vi volete fare proprio male !

Masochisti!

Ciao
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2003, 10:49   #11
angelica
Member
 
Iscritto dal: Nov 2003
Messaggi: 42
Quote:
Originariamente inviato da VICIUS
il parametro "int size" di fgets indica alla funzione il massimo elemento dell'array che puo scrivere senza andare ad invadere in altre aree di memoria. quindi il modo giusto di chiamare fgets è:
Codice:
fgets (testo, max, stdin);
Thx...comunque anche con MAX (che avevo provato, senza scriverlo nel post), il programma dà sempre lo stesso errore...
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à! (be', con cicli e puntatori me la cavo! )
__________________
ANGI
angelica è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2003, 16:43   #12
verloc
Senior Member
 
L'Avatar di verloc
 
Iscritto dal: Jan 2000
Messaggi: 551
Quote:
Originariamente inviato da angelica
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à! (be', con cicli e puntatori me la cavo! )

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.
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2003, 17:07   #13
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Quote:
Originariamente inviato da verloc
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
tnk 100000000000000000
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2003, 18:15   #14
angelica
Member
 
Iscritto dal: Nov 2003
Messaggi: 42
Quote:
Originariamente inviato da ri
dai si sa che le stl sono un universo avanti... il problema era da risolvere in C

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
angelica è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
GeForce RTX 3080 raffreddata con un diss...
Proofpoint mette in sicurezza gli agenti...
Annunci falsi su Bakeca con dati veri di...
Attenzione alla truffa dell'assegno di A...
Addio al mito delle batterie a stato sol...
400 milioni e un obiettivo ambizioso: Re...
TCL 2026: la tecnologia SQD-Mini LED arr...
Gli aggiornamenti arriveranno, ma non si...
Monopattini elettrici: addio "Far W...
Mistral AI raccoglie 830 milioni di doll...
Hacker iraniani di Handala violano la Gm...
Chi è Eddie Dalton: il cantante d...
OVHcloud mette l'Italia al centro della ...
Zeekr 007 GT sold out in Cina, si passa ...
Hisense QLED 4K da 98'' e 85'' con 144Hz...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v