Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
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


Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
La 'casetta in Canadà' di Mark Zu...
Una batteria che dura più di 5000...
Addio smemorati: WhatsApp testa una nuov...
Italia finalmente all'avanguardia con il...
Gratis e scritto con l'IA, il convertito...
Cooler Master V8 ACE 3DHP: disponibile i...
L'IA minaccia migliaia di posti nei call...
Assetto Corsa EVO introduce il foveated ...
Il modello base di NVIDIA Shield TV potr...
Meta sta sviluppando occhiali smart capa...
Ecco degli avviatori batteria auto super...
Fujifilm firma il suo obiettivo pi&ugrav...
Le nuove auto in UE devono accorgersi se...
Speciale pulizia: robot e scope elettric...
Dreame A2 3000 crolla di 800€: il robot ...
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: 12:20.


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