PDA

Visualizza la versione completa : [C] Strutture


Neptune
13-01-2010, 18:56
Salve a tutti,
avrei qualche problemino con le strutture nel c (utilizzo dev cpp come compilatore), ovvero ho il seguente codice:



#include <stdio.h>
#include <stdlib.h>

typedef struct{
int giorno;
int mese;
int anno;
}data;

typedef struct {
char nome[20];
char cognome[20];
data nascita;
int id;
}studente;

int main()
{
studente prova;
prova.id = 12;
prova.nome[] = "Gudio";
printf("%d\n", prova.id);
printf("%c\n", prova.nome[0]);

system("PAUSE");
return 0;
}


Ora questo codice mi da errore sull'assegnazione di "prova.nome[]". Ho provato anche ad inserire un singolo carattere ed il risultato è che la riga di stampa mi stampa "un carattere vuoto" e nulla più.

Sicuramente mi perdo sulla sintassi. Il mio scopo, per esercitarmi un pò sulle strutture è di creare un vettore di strutture e tra i campi della struttura dei campi di vario tipo.

Con gli int non ho problemi, con i char, quindi con i vettori invece si. Sarà che bisogna fare un passaggio per riferimento, ma non riesco "a capire" come dovrei fare.

Vi ringrazio in anticipo,
Neptune.

YuYevon
13-01-2010, 18:57
Le stringhe in C non si possono "assegnare". Devi usare la funzione strcpy in string.h, o meglio strncpy().

Neptune
13-01-2010, 19:06
Originariamente inviato da YuYevon
Le stringhe in C non si possono "assegnare". Devi usare la funzione strcpy in string.h, o meglio strncpy().

Qual'è la differenza fra le due funzioni?

YuYevon
13-01-2010, 19:30
La seconda è la versione "safe" della prima: con la strcpy() non esegui alcun controllo sulla lunghezza della stringa copiata, quindi se questa è maggiore della lunghezza del buffer in cui deve avvenire la copia ti ritrovi con un buffer overflow (che compromette sia il funzionamento che la sicurezza del programma). Con strncpy() invece specifichi come terzo argomento il massimo dei caratteri da copiare, quindi anche se la stringa sorgente risultasse più lunga verrebbe copiato un numero di caratteri pari a quello specificato da te.

Neptune
13-01-2010, 20:00
Originariamente inviato da YuYevon
La seconda è la versione "safe" della prima: con la strcpy() non esegui alcun controllo sulla lunghezza della stringa copiata, quindi se questa è maggiore della lunghezza del buffer in cui deve avvenire la copia ti ritrovi con un buffer overflow (che compromette sia il funzionamento che la sicurezza del programma). Con strncpy() invece specifichi come terzo argomento il massimo dei caratteri da copiare, quindi anche se la stringa sorgente risultasse più lunga verrebbe copiato un numero di caratteri pari a quello specificato da te.

Quindi copia i primi n valori?

Mentre la strcat e la strncat, a parte che l'ultima specifica il numero di caratteri, che fa? Copia i valori nella prima stringa eliminandoli dalla seconda?

Con con la strncpy e la strncat, se avessi un vettore di destinazione più grande che succederebbe? tipo:

Se coppiassi nella stringa "ciao mondo" la stringa "pila!" avrei "pila! mondo" o me lo sovrascriverebbe?

E per la cat?

YuYevon
13-01-2010, 20:13
Una domanda alla volta, tra l'altro fai prima a provare o a leggere su un libro che ad aspettare una risposta su un forum ;D

Comunque la funzione strcat() concatena due stringhe, o per meglio dire concatena la seconda stringa in input alla prima, ammesso che come primo argomento specifichi un buffer sufficientemente grande per "accogliere" i caratteri della stringa concatenata.



Con con la strncpy e la strncat, se avessi un vettore di destinazione più grande che succederebbe? tipo:

Se coppiassi nella stringa "ciao mondo" la stringa "pila!" avrei "pila! mondo" o me lo sovrascriverebbe?


se dopo una copia del genere andassi a stampare il buffer con una printf(), avresti soltanto "pila!" perché la strcpy aggiungerebbe il '\0' alla fine della stringa copiata, e la printf() stampa appunto fino al '\0'. Se invece andassi a stampare tutto il buffer (magari con un for per tutta la sua lunghezza) ti ritroveresti con

"pila!mondo"

ed eventuali altri caratteri sporchi dopo.



E per la cat?


Non esiste una funzione cat().

Loading