Auito!!!!Esperto di devc++ che risolva questo esercizio.

di il
1 risposte

Auito!!!!Esperto di devc++ che risolva questo esercizio.

Usando il prototipo int unisci_stringhe (char s1[] , char s2[] , char s3[]) scrivere un programma che acquisisca due stringhe contenenti varie parole separate da spazio.
La funzione deve ricopiare nella stringa destinazione s3 la seconda parola di s1 e la terza si s2.
la funzione restituisce come valore la lunghezza di s3.
Il programma da me inserito(non funzionante ovviamente) è il seguente:
#include <stdio.h>
#include <stdlib.h>

main(){
int risultato=0;
char p[30], q[30],k[30];
int unisci_stringhe (char s1[] , char s2[] , char s3[]);

printf("Inserisci prima stringa\n");
scanf("%s", p);
system("PAUSE");

printf("Inserisci seconda stringa\n");
scanf("%s", q);
system("PAUSE");


risultato= unisci_stringhe(p ,q , k);

printf("%d\n",risultato);
system("PAUSE");
}


int unisci_stringhe (char s1[] , char s2[] , char s3[]){
int i=0, j=0;
int p=0,k=0,z=0,l=0, lunghezza;
int contas1=0 , contas2=0;

while(s1!='\0'){
if(i>0){
if(s1==' ' && s1[i-1] !=' ')
{ contas1 ++;}
if(contas1==1)
{k=i+1; p=1;
while(s1!=' ' || s1!='\0'){
s3[p]=s1;
k++;
p++;

}
}
}
i++;
}

while(s2[j]!='\0'){
if(j>0){
if(s2[j]==' ' && s2[j-1] !=' ')
{contas2 ++;}
if(contas2==2)
{z=j+1;
while(s2[z]!=' ' || s2[z]!='\0'){
s3[p]=s2[z];
p++;
z++;
}
}
}j++;
}


s3[p+1]='\0';


return p;


}

1 Risposte

  • Re: Auito!!!!Esperto di devc++ che risolva questo esercizio.

    1) Usa il tag 'code' quando pubblichi il codice.
    2) Togli system (PAUSE)
    3) Usa fgets al posto della scanf. La scanf termina sugli spazi. ---> fgets (p,sizeof(p),stdin);
    4) Non riscrivere ugual codice per cercare l'inizio della parola. Crea una funzione
    5) La parte di copia s1 inizializza p a 1 e non zero. i non viene incrementata
    6) Cerca di usare il minor numero possibile di variabili
    7) Cerca di usare il minor numero possibile di condizioni oppure cerca di raggrupparle
    ...
    Rimane da dire che questa funzione così pensata (mancanza del parametro di lunghezza massima s3) è insicura su un potenziale buffer overflow...

    Studia questa versione aiutandoti con un debugger:
    
    char *trova_parola (char *s,int n)
    {
      char *p=s;
      
      while (n)
      {
        for (;*p==' ' && *p;p++);
        if (--n)
          for (;*p!=' ' && *p;p++);
      }
      return p;
    }
    
    int unisci_stringhe (char s1[], char s2[], char s3[])
    {
      char *p1,*p2;
      int len=0;
      
      p1=trova_parola (s1,2);
      p2=trova_parola (s2,3);
      
      for (;*p1 && *p1!='\n' && *p1!=' ';p1++)
        s3[len++]=*p1;
      
      for (;*p2 && *p2!='\n' && *p2!=' ';p2++)
        s3[len++]=*p2;
        
      s3[len]='\0';
      
      return len;
    }
    
    
    Saluti,
    Max
Devi accedere o registrarti per scrivere nel forum
1 risposte