Esercizio C stavolta sulle stringhe :P

di il
4 risposte

Esercizio C stavolta sulle stringhe :P

Bene quì da solo già son arrivato ad un buon punto... come sempre traccia:
Sia A un vettore di caratteri di lunghezza N contenente alcune parole (solo lettere maiuscole) separate da uno spazio. Scrivere una funzione che restituisca TRUE se i primi due caratteri di ogni parola corrispondono rispettivamente al primo e all'ultimo carattere della parola precedente.

Esempio N=25
A= |C|A|N|E| |C|E|N|A| |C|A|R|I| |C|I|E|L|O| |C|O|M|O|
Output=TRUE

Questo è il mio programma:
#include <stdio.h>
void primedue(char A[],char primdue[],int i)
{ 
  primdue[0]=A[i];
  primdue[1]=A[i+1];
  primdue[2]='\0';
}
void primaeultima(char A[],char primult[],int i,int n)
{ 
  primult[0]=A[i];
  int j=i;
  while(A[i]!=' ')
  {
    i++;
  }
  primult[1]=A[i-1];
}
int verifica (char A[],int n)
{
  int i,j,b;
  float confronto;
  char primdue_old[3],primdue[3],primult[3];
  for (i=0;i<n;i++)
  {
    primedue(A,primdue,i);
    primaeultima(A,primult,i,n);
    //
    // Just debugging...
    printf ("Stringa: %s Primdue: %s Primult: %s Primdue_old: %s\n",A,primdue,primult,primdue_old);
    //
    confronto=strcmpi(primdue_old , primult);
    if (confronto==0)
      b=1;
    else
      b=0;
    for(j=0;j<3;j++)
    primdue_old[j]=primdue[j];
  }
  return (b);
}
int main()
{
  int n,b;
  printf("Quanto deve essere lungo l'array?\n");
  scanf("%d",&n);
  n+=1;
  char A[n];
  printf("Inserire le parole desiderate \n");
  while(gets(A)!=NULL)
  {
    if(gets(A)!=NULL)
    {
     break;
    }
  }
  b=verifica(A,n);
  if (b==1)
    printf("TRUE\n");
  else
    printf("FALSE\n");
  system("pause");   
  return 0;
}
Il problema sostanzialmente credo sia nel fatto che sul ciclo di primaeultima non viene passato il parametro "i" a verifica. La mia domanda è questa, nel momento in cui la variabile "i" passa ad una funzione e viene elaborata, non dovrebbe tornare con lo stesso valore a verifica?

4 Risposte

  • Re: Esercizio C stavolta sulle stringhe :P

    Anticipo i grazie per gli aiuti ma ho risolto, se vi interessa ecco il codice:
    
    #include <stdio.h>
    int i;
    void primedue(char A[],char primdue[])
    { 
      primdue[0]=A[i];
      primdue[1]=A[i+1];
      primdue[2]='\0';
    }
    void primaeultima(char A[],char primult[])
    { 
      primult[0]=A[i];
      while(A[i]!=' ')
      {
        i++;
      }
      primult[1]=A[i-1];
    }
    int verifica (char A[],int n)
    {
      int j,b;
      float confronto;
      char primult_old[3],primdue[3],primult[3];
      for (i=0;i<n;i++)
      {
        primedue(A,primdue);
        primaeultima(A,primult);
        //
        // Just debugging...
        printf ("Stringa: %s Primdue: %s Primult: %s Primult_old: %s i: %d\n",A,primdue,primult,primult_old,i);
        //
        confronto=strcmpi(primult_old , primdue);
        if (confronto==0)
          b=1;
        else
          b=0;
        for(j=0;j<3;j++)
        primult_old[j]=primult[j];
      }
      return (b);
    }
    int main()
    {
      int n,b;
      printf("Quanto deve essere lungo l'array?\n");
      scanf("%d",&n);
      n+=1;
      char A[n];
      printf("Inserire le parole desiderate \n");
      while(gets(A)!=NULL)
      {
        if(gets(A)!=NULL)
        {
         break;
        }
      }
      b=verifica(A,n);
      if (b==1)
        printf("TRUE\n");
      else
        printf("FALSE\n");
      system("pause");   
      return 0;
    }
    
  • Re: Esercizio C stavolta sulle stringhe :P

    
    Vedo con piacere che la lezione precedente è servita.
    
    fai attenzione,
    >strcmpi non è ANSI C - Capisco che è comodo confrontare ignorando il case -
     usa strncmp (str1, str2, size);
     void uppercase (char *string)
     {
        /*
            Converte in maiuscolo
        */
        char *p=string;
    
        for (;*p;p++)
            if (*p >=97 && *p <= 122) 
                *p=*p-32;
     }
    
    >gets è pericolosa non dovresti mai usarla per rischio di buffer overflow - Non è deprecata per compatibilità -  usa piuttosto fgets.
    
    >primaeultima - la printf di debug potrebbe non fermarsiiiiiiii ... :)
    
    >if (confronto==0)
      b=1;
     else
      b=0;
    Usa la tecnica che hai visto prima... b può cambiare...guarda bene
    
    >for(j=0;j<3;j++)
      primult_old[j]=primult[j];
     perchè non usi strncpy o memcpy visto che devi includere string.h per la comparazione di stringhe?
    
    Saluti,
    Max
  • Re: Esercizio C stavolta sulle stringhe :P

    Grazie per i consigli
    Allora per l'uppercase potrei utilizzare anche strupr?
    sul gets non la sapevo sta cosa
    perchè la printf di debug potrebbe nn fermarsi più?
    la cosa di B non l'avevo notata
    quel for non l'ho aggiustato c'avevo già pensato

    Grazie cmq
  • Re: Esercizio C stavolta sulle stringhe :P

    >.Allora per l'uppercase potrei utilizzare anche strupr?
    `strupr' non è portabile. Puoi usare toupper definito in ctype.h ma funziona solo sul singolo char

    > Sul gets non la sapevo sta cosa
    In realtà esistono molte funzioni in C che sarebbero da deprecare per la sicurezza.

    > Perchè la printf di debug potrebbe nn fermarsi più?
    Manca il terminatore di stringa '\0' nella funzione primaeultima

    > La cosa di B non l'avevo notata
    Identico al caso precedente.


    Di niente, figurati...
Devi accedere o registrarti per scrivere nel forum
4 risposte