Strcpy e char

di il
21 risposte

Strcpy e char

Salve. Ho un problema col mio codice...
Al momento del build che Code Blocks attua, visualizzo il seguente messaggio di "Attenzione" in tutte le righe in cui è presente il vettore vinc (di tipo char): "Warning: assignment makes integer from pointer without a cast [enabled by default]"
In tutte le righe di codice in cui, invece, utilizzo l'istruzione strcpy sul vettore vinc, visualizzo invece questo messaggio: "Warning: passing argument 2 of 'strcpy' makes pointer from integer without a cast [enabled by default]"

Non riesco a capire quale sia il problema, in quanto per passare un vettore nei parametri della funzione non ci dovrebbe esser bisogno di puntatori per modificarlo. E inoltre Non capisco il messaggio sugli strcpy: vinc (di tipo char) dovrebbe assumere esattamente il valore di un altro vettore di tipo char!
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#define dim 5

void ordin (char vinc[], int vincit[])
{
   int i, c, app;
   char app1[20];

   for (i=1;i<dim;i++)
   {
      app=vincit[i];
      strcpy(app1,vinc[i]);

      for (c=i-1;(c>=0) && (vincit[c]>app);c--)
      {
          vincit[c+1]=vincit[c];
          strcpy(vinc[c+1], vinc[c]);
      }

      vincit[c+1]=app;
      vinc[c+1]=app1;
   }
}

void random(int x[], int jolly[])
{
    srand(time(NULL));

    int c, z=0, s=0;
    bool trovato=false;

    for(c=0;c<7;c++)
        x[c]=rand()%90+1;

    do
    {
        for(s=0;s<7;s++)
        {
            if(x[z-1]==x[s])
                trovato=true;

            if(trovato==true)
            {
                trovato=false;
                x[z]=rand()%90+1;
            }
        }

        z++;
    }while(z<7);

}

void vincitori(int n1[], int n2[], int n3[], int n4[], int n5[], int n6[], int jolly[], int x[], char nom[])
{
    int i=0,c, z=0, w=0, u=0;
    char vinc[10][20];
    int vincit[10];

    do
    {
        for(c=0;c<7;c++)
        {
            if(n1[z]==x[c] && n2[z]==x[c] && n3[z]==x[c] && n4[z]==x[c] && n5[z]==x[c] && n6[z]==x[c])
            {
                strcpy(vinc[c], nom[c]);
                vincit[c]=7;
                i++;
                w++;
            }
        }

        for(c=0;c<7;c++)
        {
            if(n1[z]==x[c] && n2[z]==x[c] && n3[z]==x[c] && n4[z]==x[c] && n5[z]==x[c] && jolly[c]==x[6])
            {
                strcpy(vinc[c], nom[c]);
                vincit[c]=6;
                i++;
                w++;
            }
        }

        for(c=0;c<7;c++)
        {
            if(n1[z]==x[c] && n2[z]==x[c] && n3[z]==x[c] && n4[z]==x[c])
            {
                strcpy(vinc[c], nom[c]);
                vincit[c]=4;
                i++;
                w++;
            }
        }

        for(c=0;c<7;c++)
        {
            if(n1[z]==x[c] && n2[z]==x[c] && n3[z]==x[c])
            {
                strcpy(vinc[c], nom[c]);
                vincit[c]=3;
                i++;
                w++;
            }
        }

            z++;

    }while(z==7);

    ordin(vinc, vincit);

    printf("Vincitori: \n");

    for(u=0;u<=w;u++)
    {
        printf("%c \t %i", vinc[u],vincit[u]);
    }

}

int main()
{
    int n1[dim],n2[dim],n3[dim],n4[dim],n5[dim],n6[dim],jolly[dim],x[6];
    char nom[dim][20], risp;
    int i=0;

    random(x, jolly);

    do
    {
        printf("Nome: ");
        scanf("%s", nom[i]);
        printf("Inserisci sei numeri separati dallo spazio: ");
        scanf("%i %i %i %i %i %i", &n1[i], &n2[i], &n3[i], &n4[i], &n5[i], &n6[i]);
        printf("Inserisci Jolly: ");
        scanf("%i", &jolly[i]);
        printf("Continuare? s/n: ");
        scanf("\n%c", &risp);

        i++;
    }while(risp=='s' || risp=='S');

    vincitori(n1, n2, n3, n4, n5, n6, jolly, x, nom);
}

21 Risposte

  • Re: Strcpy e char

    La nostra prof ci fa scrivere (nei parametri) "const int vett[]" -giusto un esempio- quando il parametro e' solo di input. Oggi ci ha spiegato che serve per evitare errori, non ho capito bene cosa significa, ma potrebbe servirti per risolvere l'errore. Se invece il parametro e' anche di output, bisogna mettere anche la & nel parametro (senza il const: "int &vett[]").
  • Re: Strcpy e char

    Devid1910 ha scritto:


    La nostra prof ci fa scrivere (nei parametri) "const int vett[]" -giusto un esempio- quando il parametro e' solo di input. Oggi ci ha spiegato che serve per evitare errori, non ho capito bene cosa significa, ma potrebbe servirti per risolvere l'errore. Se invece il parametro e' anche di output, bisogna mettere anche la & nel parametro (senza il const: "int &vett[]").
    Ciao e grazie per la risposta.
    Ho provato, ma ora il messaggio di Warning diventa un vero e proprio errore. Ergo non è là il problema, credo...
  • Re: Strcpy e char

    Questo
    
    vinc[1]
    
    non è un puntatore, ma indicizzando il vettore prelevi il dato diventa dunque un semplice "char", ma dato che la strcpy () richiede un puntatore allora ti da l'errore.
    Per passare dunque il puntatore basta anteporre & come faresti per una normale variabile.
    
    strcpy(dest, &src[1]);
    
  • Re: Strcpy e char

    Allora, non voglio dire inesattezze, ma :
    La strcpy deve avere come parametri 2 stringhe (puntatori/vettori char come detto sopra)

    --- strcpy(app1,vinc); e nelle successive ---

    qua stai passando un carattere, che non è la stessa cosa, alla funzione devi passare stringhe (puntatori/vettori char)!
    Per copiare singoli caratteri usa l'assegnazione.

    Per il const: serve a indicare che quella variabile non deve essere modificata, più che per evitare errori, serve a evitare che la variabile sia modificata accidentalmente quando è passata.
    Come parametro di output cosa intendi?
    Perchè l'output è in genere il valore che restituisce la funzione non i parametri passati ad essa.
  • Re: Strcpy e char

    Mentre il primo errore è dato
    
    vinc[1]=app1;
    
    ma app1 è un vettore e in questo caso non lo dereferenzi tramite [] e dunque è un puntatore, mentre vinc[1] è un char come spiegato sopra e quindi scatta l'errore.
    infine, cosa che mi sono scordato prima, in
    
    vinc[][]
    
    il comportamento è un pò diverso, perché è un puntatore a vettori e quindi diventa lecito passarlo a strcpy così
    
    char src[123][456];
    strcpy(dest, src[1]);
    
  • Re: Strcpy e char

    Non ho capito perché starei passando un carattere e non la stringa intera
  • Re: Strcpy e char

    Potrei chiedere un'altra cosa off topic? (riguardante sempre questo codice naturalmente).
  • Re: Strcpy e char

    FredTagliacapelli ha scritto:


    Non ho capito perché starei passando un carattere e non la stringa intera
    Perche' e' un vettore di caratteri, non una variabile di tipo string. Non sono la stessa cosa, anche se si assomigliano.
    (Ovviamente, se non sto sbagliando)
  • Re: Strcpy e char

    FredTagliacapelli ha scritto:


    Non ho capito perché starei passando un carattere e non la stringa intera
    Parli di vinc[1] ? Non capisci perché vinc[1] è un char ?
  • Re: Strcpy e char

    Si presuppone che una stringa contenga, ad esempio, "Davide", quindi è per l'appunto un vettore. Un carattere è invece una normale variabile che conserva massimo una sola lettera. Bene, perché "app1" passerebbe un carattere, se è un vettore e io inserisco un nome?
    Credo ci sia un'incomprensione
  • Re: Strcpy e char

    Il problema è vinc non app1

    con vinc passi tutta la stringa, con vincpassi il carattere di posto i.
  • Re: Strcpy e char

    E' infatti un vettore di caratteri, che simulano la classe stringa. In C non ci sono le classi, quindi si usano solo i vettori di caratteri. Non sono la stessa cosa...
    *Anzi, la classe stringa simula il vettore di caratteri, proveniente dal C.
  • Re: Strcpy e char

    Mikelius ha scritto:


    il problema è vinc non app1

    con vinc passi tutta la stringa, con vincpassi il carattere di posto i.


    Non è che ti stai confondendo? L'indice i scorre il vettore in verticale, perciò nome per nome... non scorre in orizzontale, non scorre carattere per carattere, no?
  • Re: Strcpy e char

    No... ad esempio

    int vett[3];
    dichiari la variabile vett di tipo vettore di int di 3 elementi
    i 3 elementi sono : vett[0] , vet[1] e vett[2] (si parte sempre dallo 0) ;

    char stringa[10];
    crea un vettore di char che può contenere fino a 9 caratteri (uno devi riservarlo ad '\0' che è un carattere speciale che indica la fine della stringa)

    se volessi dichiarare 10 stringhe dovresti usare le matrici , vettori bidimensionali
    char stringhe[10][10] ;
    crea una matrice che può contenere 10 stringhe di 9 (+ '\0') caratteri
Devi accedere o registrarti per scrivere nel forum
21 risposte