Mer 21 Agosto, 09:46:41 - 2019

Autore Topic: Esercizio 2 sulle stringhe (rovescia)  (Letto 984 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline heavenriver

  • Global Moderator
  • Direttore di Dipartimento
  • *****
  • Post: 1060
  • FeedBack: +103/-67
  • z = z² + c
    • Mostra profilo
    • Sito web (Curriculum Vitae)
Esercizio 2 sulle stringhe (rovescia)
« il: Sab 07 Giugno, 18:42:26 - 2014 »
Ho provato a fare l'esercizio 2 di questa lezione, la mia versione è:

Codice: [Seleziona]
#include <stdio.h>
#include <stdlib.h>

char* rovescia(char* in, char** out)
 {
 int end = sizeof(in);
 int i;
 for(i = 0; i < end; i++)
  {
  (*out)[i] = in[end - i];
  printf("Assigned element %d to out\n", i);
  }
 return *out;
 }

int main()
 {
 char* s = malloc(100 * sizeof(char));
 rovescia("weierstrasslaplacemaxwell", &s);
 printf("%s\n", s);
 free(s);
 return 0;
 }

(Ho dovuto cambiare il main rispetto a quello fornito perché mi andava in segmentation fault)
Output:

Codice: [Seleziona]
Assigned element 0 to out
Assigned element 1 to out
Assigned element 2 to out
Assigned element 3 to out
Assigned element 4 to out
Assigned element 5 to out
Assigned element 6 to out
Assigned element 7 to out
artsreie

...E dovrebbe restituirmi l'inverso della stringa d'input (llewxamecalpalssartsreiew).
Non capisco cosa c'è che non va =/

Offline CIP

  • Professore Associato
  • *
  • Post: 500
  • FeedBack: +36/-7
    • Mostra profilo
Re:Esercizio 2 sulle stringhe (rovescia)
« Risposta #1 il: Sab 07 Giugno, 22:44:08 - 2014 »
il problema è nella sizeof(in) ! stai assegnando ad end la size di un puntatore, non la size della stringa :P. Attenta anche agli indici
Codice: [Seleziona]
(*out)[i] = in[end - i]; quando i=0 (nel caso in cui la lunghezza della stringa corrisponda con end) andresti a prendere il carattere in[end], cioè il terminatore di stringa.
« Ultima modifica: Dom 08 Giugno, 02:11:00 - 2014 da CIP »
“If debugging is the process of removing software bugs, then programming must be the process of putting them in.” -Edsger Dijkstra

Offline lm

  • Studente di Dottorato
  • ***
  • Post: 108
  • FeedBack: +11/-1
    • Mostra profilo
Re:Esercizio 2 sulle stringhe (rovescia)
« Risposta #2 il: Dom 08 Giugno, 16:29:38 - 2014 »
CIP ha ragione ! :D

Se  può esserti utile, questa è la mia implementazione:

Codice: [Seleziona]
void rovescia (char* s, char**prev) {

int i, j, len = strlen(s);
char* rev = calloc(len, sizeof(char));

char c ;

for(i=0,j=len-1; i<len; i++,j--)
rev[j] = s[i];

*prev = rev;

}

PS: E' stato controllato con Valgrind
« Ultima modifica: Dom 08 Giugno, 17:23:38 - 2014 da lm »
Negli anni '60 il filosofo Dreyfus, agguerrito avversario dell'IA, aveva dichiarato che una macchina non avrebbe MAI saputo giocare bene a scacchi. Nel 1967 egli fu battuto da un programma chiamato MacHack. [..]

Offline heavenriver

  • Global Moderator
  • Direttore di Dipartimento
  • *****
  • Post: 1060
  • FeedBack: +103/-67
  • z = z² + c
    • Mostra profilo
    • Sito web (Curriculum Vitae)
Re:Esercizio 2 sulle stringhe (rovescia)
« Risposta #3 il: Dom 08 Giugno, 19:07:19 - 2014 »
Te pareva! Ovviamente cado sulle cretinate :P

Grazie a tutti e due! La versione di lm mi piace di più :D però adesso funziona anche la mia, mi è bastato cambiare queste righe:

Codice: [Seleziona]
int end = strlen(in);
e

Codice: [Seleziona]
(*out)[i] = in[end - i - 1];
E mi stampa quel che deve :sisi:
Grazie ancora!

Offline yellow

  • Neo-Laureato
  • **
  • Post: 59
  • FeedBack: +1/-0
    • Mostra profilo
Re:Esercizio 2 sulle stringhe (rovescia)
« Risposta #4 il: Mer 29 Ottobre, 21:07:43 - 2014 »
Questa implementazione funziona, tuttavia mi da errore su valgrind, precisamente:
Codice: [Seleziona]
==31742== 1 errors in context 1 of 1:
==31742== Conditional jump or move depends on uninitialised value(s)
==31742==    at 0x4C2E0F8: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==31742==    by 0x4EA78BB: puts (ioputs.c:36)
==31742==    by 0x4006C6: main (Es2.c:24)
Cosa può essere? 0.o Grazie.
il codice è il seguente
Codice: [Seleziona]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void rovescia(char* s, char** result){
int sizeS=(int)strlen(s);
int i=0;
int j=sizeS-1;
int aux;
*result=malloc(sizeS*sizeof(char*));
char* t=*result;
while(i<sizeS){
aux=(int)s[i++];
t[j--]=(int)aux;
}
}
int main(){
    char* s;
    rovescia("roma", &s);
    printf("%s\n", s); // stampa amor
    free(s);
    return 0;
}