View Full Version : [C] stringa inversa
Salve dovrei scrivere un funzione che inverte una stringa, avevo pensato a qualcosa del genere:
void reverse(char in[], char out[])
{
int i, c;
in[i] = 0;
for(i = 0; i < c; ++i){
in[i] = c;
--i; }
if( c == '\n'){
out[i] = in[i];
}
}
Potete gentilmente dirmi se può andar bene o se ci sono errori darmi dei consigli? GRAZIE
magix2003
25-08-2008, 10:44
No. Ci sono degli errori. Il primo, il più lampante, è che la variabile c non è inizializzata.
for(i = 0; i < c; ++i){
in[i] = c;
--i; }
ma incrementi e decrementi la variabile i nello stesso ciclo?
L'hai testato quel codice?
no non lo testata la funzione, pensavo di incrementare la i e poi decrementarla per copiare l'inverso.....:mbe:
the_ivos
25-08-2008, 11:26
Alla funzione devi passare anche la lunghezza della stringa...
poi io farei cosi (non lo testato):
void reverse(char stringa[], int lunghezza)
{
int i, cicli;
char carattere;
i = 0;
cicli = lunghezza / 2;
for(; cicli > 0;cicli--)
{
carattere = stringa[i];
stringa[i] = stringa[lunghezza];
stringa[lunghezza]= carattere;
i++;
lunghezza--;
}
}
magix2003
25-08-2008, 11:27
A me sembra più semplice così:
char aString[] = "ciao";
int length = strlen(aString);
char bString[length + 1];
int j =0;
int i;
bString[length] = '\0';
for (i = (length - 1); i >=0; i--) {
bString[j] = aString[i];
j++;
}
printf("%s\n", bString);
DanieleC88
25-08-2008, 11:28
Puoi fare una reverse in place (la butto giù al momento, potrebbe essere sbagliata):
void reverse(char *str)
{
size_t len = (strlen(str) - 1);
unsigned x;
char *end;
for (end = &str[len]; len > 1; ++str, --end)
{
char tmp = *end;
*end = *str;
*str = tmp;
len -= 2;
}
}
Ovviamente presupponendo che str sia null-terminated.
ciao ;)
DanieleC88
25-08-2008, 11:30
Azz non avevo notato altre due soluzioni prima di me... sto invecchiando. :asd:
slartibartfast
25-08-2008, 11:38
La soluzione più semplice potrebbe essere una cosa così:
#include <stdio.h>
#include <string.h>
void reverse(char *in, char *out)
{
out += strlen (in) - 1;
*out = 0;
while (*in)
*out-- = *in++;
}
int main(int argc, char *argv[])
{
char buf[5];
reverse ("ciao", buf);
puts (buf);
return 0;
}
DanieleC88
25-08-2008, 11:59
La soluzione più semplice potrebbe essere una cosa così:
[CODE]#include <stdio.h>
#include <string.h>
void reverse(char *in, char *out)
{
out += strlen (in) - 1;
*out = 0;
while (*in)
*out-- = *in++;
}
Così non sovrascrivi il terminatore appena impostato? :stordita:
slartibartfast
25-08-2008, 12:17
Così non sovrascrivi il terminatore appena impostato? :stordita:
Giusto, mio errore :fagiano:
così dovrebbe andare bene
void reverse(char *in, char *out)
{
out += strlen (in);
*out-- = 0;
while (*in)
*out-- = *in++;
}
Grazie a tutti, esaminerò i codici da voi scritti.:D
comunque la volevo scrivere senza usare la funzione strlen.... è possibile?
wingman87
25-08-2008, 13:15
Sì, puoi o passare alla funzione la lunghezza della stringa come ti ha consigliato the_ivos, oppure devi andare in fondo alla stringa di input e poi tornare indietro. Ma perché non vuoi usare strlen?
stò seguendo degli esercizi e ancora non è previsto l'uso di tali funzioni...
stò seguendo degli esercizi e ancora non è previsto l'uso di tali funzioni...
Puoi farti da solo la tua strlen allora, in fondo dovrà solo controllare un carattere alla volta finchè non trova il valore '\0' ;)
slartibartfast
25-08-2008, 16:32
Puoi farti da solo la tua strlen allora, in fondo dovrà solo controllare un carattere alla volta finchè non trova il valore '\0' ;)
Esatto, così può andare?
void reverse(char *in, char *out)
{
char *c = in;
while (*c++);
out += (c - in - 1);
*out-- = 0;
while (*in)
*out-- = *in++;
}
OK grazie a tutti per i consigli....
DaRk\S0ul
03-03-2009, 15:45
salve io avrei fatto in questo modo, premetto che dal libro su cui sto studiando, sono alle prime armi, dispongo di una funzione che mi crea la stringa dai caratteri in entrata e mi ritorna la sua lunghezza, dati che conto di utilizzare nella mia funzione reverse. la funzione è
char reverse (char stringa[], lunghezza)
{ int lunghezza;
char stringarev[lunghezza];
char stringa[lunghezza];
int i;
for (i=lunghezza; i<= lunghezza && stringa[i]!='\0' && stringa[i]!='\n';--i )
{
int j=0;
stringarev[j]=stringa[i];
++j;
}
if (stringa[i]=='\0')
--i;
else
if (stringa[i]=='\n')
--i;
return stringarev;
}
non ho avuto modo di provarla anche perchè ho difficoltà con il main che mi da 10000 errori.
help!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.