Newsgroup: it.comp.lang.c
Titolo: copiare parte di una stringa in un'altra

Salve a tutti il mio problema e' realizzare una funzione che copia parte 
di una stringa in un'altra(che e' all'interno di una struct) e 
restituisce un puntatore alla struct stessa...per spiegarmi meglio:
la struct e' definita cosi':
typedef struct {
  char nome[20];
  char cognome[20];
} persona;
e la funzione e' definita cosi':
persona * stringtoperson(char s[]);
Ho provato varie soluzioni ma non ne funziona nessuna, anzi non riesco 
nemmeno a compilarle.
Vi posto quella che mi da meno errori sicuro di un vostro aiuto.
#include <stdio.h>  /* necessaria per stampare sul video */
#include <stdlib.h> /* necessaria per utilizzare la malloc() */
#include <string.h> /* serve per le funzioni che possono manipolare 
stringhe */
typedef struct {
  char nome[20];
  char cognome[20];
} persona;
/* riceve una stringa di 40 caratteri.I primi 20 sono il nome e gli 
altri 20 sono il cognome */
persona * stringtoperson(char s[]){
   persona * tmp;	
   char * p = s[0];
   tmp = malloc(sizeof(voce));
   if(tmp == NULL) {
     printf("\nErrore\n");
     return -1;
   }
   strncpy(*tmp.nome, p, 20);
   p=p+20;
   strncpy(*tmp.cognome, p, 20);
   return tmp;
}
errori:
prova.c:19: error: request for member `nome' in something not a 
structure or union
prova.c:21: error: request for member `cognome' in something not a 
structure or union
Ciao e grazie in anticipo

Roger Sanchez wrote:

penso che volessi scrivere questa funzione:
persona * stringtoperson(char s[]){
   persona * tmp;
   char * p = s;
   tmp = (persona*)malloc(sizeof(persona));
   if(tmp == NULL) {
     printf("\nErrore\n");
     return NULL;
   }
   strncpy(tmp->nome, p, 20);
   p=p+20;
   strncpy(tmp->cognome, p, 20);
   return tmp;
}
ciao.

 ciao.
Innanzi tutto grazie per la risposta. Avevo provato anche io qualcosa di 
simile, ma come con il mio codice anche col tuo mi appare questo errore:
$gcc -Wall -pedantic -g prova.c -o prova
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0x18): In 
function `_start':
../sysdeps/i386/elf/start.S:77: undefined reference to `main'
collect2: ld returned 1 exit status
provando su un altro pc:
/usr/lib/gcc/i586-mandrake-linux-gnu/3.4.1/../../../crt1.o(.text+0x18): 
In function `_start':
../sysdeps/i386/elf/start.S:98: undefined reference to `main'
collect2: ld returned 1 exit status
Se invece cambio (tmp->nome, p, 20) con (tmp.nome, p, 20)
mi dice:
error: request for member `nome' in something not a structure or union
E sinceramente non capisco perche' visto che mi e' sembrato di capire 
che sono due scritture equivalenti.
Confido in un tuo ulteriore aiuto, ciao e grazie.

 che sono due scritture equivalenti.
non sono affatto equivalenti. dovresti invece scrivere: 
(*tmp).nome
ciao.

 }
E` cosa buona e giusta utilizzare strncpy, ma attenzione che il
risultato potrebbe essere una stringa non null-terminata (se l'input e`
piu` lungo di 20 caratteri):
strncpy(tmp->nome, p, 20);
/* Metto il terminatore */
tmp->nome[19] = '\0';
Luca
-- 
Home: 
http://kronoz.cjb.net
Dicono che  il cane sia  il miglior  amico dell'uomo. Secondo me  non e`
vero. Quanti dei vostri amici avete fatto castrare, recentemente?