Newsgroup: it.comp.lang.c
Titolo: [STRNCPY]PICCOLO PROBLEMA

Ciao a tutti. Devo creare un programma che chieda all'utente il primo nome,
il secondo nome e il cognome. Il programma deve memorizzare in una stringa
l'iniziale del primo nome seguita da un punto e uno spazio, l'iniziale del
secondo nome seguita da un punto e uno spazio, e il cognome. Ad esempio,
introducendo Mario Luigi Rossi, l'output deve essere "M. L. Rossi". Segue il
codice (piccolissimo) da me scritto. Cosa non va? L'ouput di questo codice
è(seguendo sempre l'esempio) "MLuigi. L. Rossi". Perché? Grazie
anticipatamente
#include<stdio.h>
#include<string.h>
char nome[15],s_nome[15],cognome[20];/*Questi array servono per
l'inserimento
           dei dati da parte dell'utente  */
char inom[1],is_nom[1];   /* In questi array vengono copiate solo le
iniziali*/
size_t n;
char *x,*y;
int main()
{
 puts("\n\t\tInserisci il primo nome, il secondo nome e il cognome");
 puts("\n\tPrimo nome: ");
 gets(nome);
 /* Pulisce il flusso stdin */
 fflush(stdin);
 puts("\n\tSecondo nome: ");
 gets(s_nome);
 fflush(stdin);
 puts("\n\tCognome: ");
 gets(cognome);
 fflush(stdin);
 x=strncpy(inom,nome,1);   /* Copia l'iniziale del primo nome */
 y=strncpy(is_nom,s_nome,1);  /* Copia l'iniziale del secondo nome */
 printf("\n\t\tL'operazione mostra il seguente risultato:\n\n\t\t%s. %s. %s
",
  x,y,cognome);
 return 0;
}

 cuttone
Ciao Roberto,
secondo me il problema sta nel fatto che tu hai dimensionato al minimo gli
array di char:
 char inom[1],is_nom[1];
Di conseguenza la funzione strncpy quando vi copiera´ le iniziali non puo´
terminare la stringa con 0, essendoci spazio solo per un carattere.
Prova ad aumentare le dimensioni di questi 2 array a 2.
Maurus

SEI UN GRANDE!!!!! :))))
hai ragione! ora va benissimo.
Grazie (come sempre)
"Maurus" <REMOVE...@rocketmail.com-REMOVE> ha scritto nel messaggio
news:9i1msk$ke2$1...@newstoo.ericsson.se...


  x,y,cognome);
printf(
"\n\t\tL'operazione mostra il seguente risultato:\n\n\t\t%c. %c. %s ",
inom,is_nom ,cognome);
ciao
cladig




 ha scritto nel messaggio
news:3b44677e...@news.libero.it...


   x,y,cognome);
[...]
Ma la speicfica non richioedeva di *memorizzare* l'iniziale piů punto piů
spazio?
Allora puoi fare cosě:
char stringa1[4], stringa2[4];
...
stringa[0] = nome[0];
strcat(stringa, ". ");
stringa2[0] = s_node[0];
strcat(stringa2, ". ");
....
ecc
Inoltre perchč hai dichiarato tutte quelle variabili fuori dal main?
e ancora la variabile n non č utilizzata (almeno nello spezzone di codice
mostrato).
Un' ultimo consiglio : non utilizzare gets che viene considerata una
funzione poco sicura. Infatti se si inseriscono piů caratteri di quelli che
il buffer puň contenere il programma puň andare in errore. Meglio quindi
fgets.
Ciao.

  printf("\n\t\tL'operazione mostra il seguente risultato:\n\n\t\t%s. %s.
%s
per lasciarlo simile e prendere spunto da cio' che gia' avevi fatto.
Alex

 ...
Ops, mi sono dimenticato di inizialzzare le stringhe :
char stringa1[4] = "", stringa2[4] = "";
...

 modi diversi. ......
Lo so, ma sono ancora alle prime armi...:***(

banalità della domanda e per la mia ignoranza
Quando dimensioni un array (es: char s[10];), il 10 e' da intendersi
come 'numero di elementi contenuti nell'array'.
s[] potra' contenere fino a 10 elementi, da s[0] a s[9].
NB: lo spazio per il terminatore di stringa ('\0') deve essere
allocato come elemento dell'array, percio' una stringa di 10 byte
dovra' essere dichiarata come array di 11 elementi, 10 per la stringa
piu' 1 per il terminatore.
Se ti risolta piu' comprensibile puoi scrivere:  char s[10+1];
ciao, acc.   
a...@libero.it