[RISOLTO] ARITMETICA DEI PUNTATORI C

di Anonimizzato13739 il
8 risposte
Salve a tutti, ho bisogno di una spiegazione e solo voi potete aiutarmi
ho questo programma di un esercizio:
#include <stdio.h>

char *f(char *s, char *t, char *out) ;

int main(void)
{
char s[] = "ISBN-978-8884981431";
char t[] = "ISBN-978-8863720181";
char out[10];

printf ("%s\n", f(s,t,out));
return 0;
}

char *f (char s[], char t[], char out[]) {
int i;
for(i=0; s[i] == t[i]; i++)
	out[i] = s[i];
out[i] = '\0';
return &out[0];
}
mi chiede di scrivere la funzione con l'aritmetica dei puntatori, ma non so come fare. conosco l'aritmetica ma non lo riesco a tradurre in nessun modo mi spegate come fare please ??

8 Risposte

  • La funzione l'hai portotipizzata bene ma dichiarata male.Dichiarala come nel prototipo.
    Poi cosa non riesci a capire sulla alritmetica dei puntatori?
  • Si scusa perchè la stavo modificando e non ho completata
    ti scrivo la traccia dell'esercizio cosi capisci meglio:
    "Dopo aver indicato l’output del seguente programma, riscrivere la funzione f us-
    ando l’aritmetica sui puntatori invece dell’indicizzazione dell’array (dovranno essere eliminate
    tutte le occorrenze della variabile i e tutti gli usi dell’operatore [])."
  • Invece di accedere all'array tramite un indice, es.
    for(i=0; s[i] != '\0'; i++)
    accedi direttamente con un puntatore, es.:
    for(; *s != '\0'; s++)
    Quindi il tuo for lo puoi cambiare in
    for(; *s == *t; s++, t++) {
       *out = *s;
       out ++;
    }
    Alla fine, per terminare la stringa out diventa semplice:
    *out = '\0';
    mentre per la return devi esserti fatto una copia del puntatore out in input (ricorda che &vett[0] è uguale a vett), es.
    
    char *outoriginal=out;
    ...
    return outoriginal;
    
    Oppure invece di salvare il valore originale puoi utilizzare un altro puntatore per fare il ciclo al posto di out e ritornare poi out (alla fine poco cambia).
  • Grazie candaluar
    un ultima cosa ho modificato il programma così secondo le tue direttive:
    #include <stdio.h>
    
    char *f(char *s, char *t, char *out);
    
    int main(void)
    {
    char s[] = "ISBN-978-8884981431";
    char t[] = "ISBN-978-8863720181";
    char out[10];
    
    printf ("%s\n", f(s,t,out));
    return 0;
    }
    
    char *f(char *s, char *t, char *out) 
    {
    for(;*s==*t;s++,t++)
    {
     *out=*s;
     out++;
    }
    *out='\0';
    
    char *nuout=out;
    
    return nuout;
    }
    me lo compila ma in output non mi da niente, devo correggere anche nel programma principale?
  • Se inizializzi nuout alla fine, copiandoci out, questo punterà alla fine della stringa (e quindi al carattere null) perchè out lo hai fatto avanzare.
    nuout deve essere inizializzato all'inizio della funzione, per salvare l'inizio della stringa.
  • Grazie mille
  • 
    #include <stdio.h>
    
    char *f(char *s, char *t, char *out);
    
    int main(void)
    {
        char s[] = "ISBN-978-8884981431";
        char t[] = "ISBN-978-8863720181";
        char out[10];
    
        printf ("%s\n", f(s,t,out));
        return 0;
    }
    
    char *f(char *s, char *t, char *out)
    {
        char st* = out;
    
        while ( *s && *t  && *s == *t++  )
            *out++ = *s++;       
        *out = '\0';
    
        return st;
    }
    
  • Dimenticavo naturalmente la tua applicazione va in buffer overflow.
Devi accedere o registrarti per scrivere nel forum
8 risposte