Newsgroup: it.comp.lang.c
Titolo: Copiare posizione array di caratteri

Salve,
non riesco a copiare un carattere da un array[a] ad un array[b], c'è
qualcosa che non mi quadra.
Vi posto la parte di codice, vi ringrazio in anticipo.
char clc_cognome(char *cgn) //calcolo del codice per il cognome
{
	int count=1;
	int cnt_vocali=1;
	int i;
	char *cod_cgn=malloc(80*sizeof(char));
	char *vocali=malloc(80*sizeof(char));
	for(i=0;i<strlen(cgn);i++)
	{
			if(*(cgn+i)=='A' || *(cgn+i)=='E' || *(cgn+i)=='I' || *(cgn+i)=='O'
|| *(cgn+i)=='U' || *(cgn+i)=='a' || *(cgn+i)=='e' ||
			   *(cgn+i)=='i' || *(cgn+i)=='o' || *(cgn+i)=='u')
			{
				*(vocali+cnt_vocali)=*(cgn+i); (QUI CGN È AVVALORATO MA NON VIENE
COPIATO IN VOCALI)
				cnt_vocali++;
				printf("Vocali: %c \n", *(vocali+cnt_vocali));
			}
			else if(*(cgn+i)!='\0')
			{
				if(count<=3)
				{
				*(cod_cgn+count)=*(cgn+i); (IDEM)
				count++;
				}
				printf("Consonanti: %c \n", *(cod_cgn+count));
			}
	}
}
Saluti
Fabrizio

 }
Ciao, non ho ben capito cosa dovrebbe fare questa funzione.
Comunque l'ho reindentata e modificata con qualche commento che spero
possa esserti utile (ti servir� un compilatore conforme al C99 se
vorrai compilare questo codice):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void clc_cognome(char *cgn) {
     /* Nel caso cgn == NULL otterremmo un "Segmentation fault"
      * calcolando !strcmp(cgn, "") prima di !cgn */
     if(!cgn || !strcmp(cgn, "")) {
         printf("Stringa Nulla.\n\n");
         return;
     }
     /* Controllare che malloc sia andata a buon fine.
      * Non conoscendo bene lo scopo di questa funzione
      * mi � sembrato comunque sufficiente allocare lo stesso
      * spazio della stringa in input + un byte per '\0' */
     char *cod_cgn = malloc(strlen(cgn) + 1);
     char *vocali = malloc(strlen(cgn) + 1);
     /* Con i compilatori moderni � consigliato
      * l'uso di indici e array */
     for (int i = 0, v = 0, c = 0; i < strlen(cgn); i++) {
         if (cgn[i] == 'A' || cgn[i] == 'E' || cgn[i] == 'I' ||
             cgn[i] == 'O' || cgn[i] == 'U' || cgn[i] == 'a' ||
             cgn[i] == 'e' || cgn[i] == 'i' || cgn[i] == 'o' ||
             cgn[i] == 'u') {
                 vocali[v] = cgn[i];
                 printf("%s %c \n", "Vocale:     ", vocali[v++]);
         } else if (cgn[i] != '\0') {
                 /* if(count <= 3) ### perch� proprio 3 ? ### { */
                 cod_cgn[c] = cgn[i];
                 /* } */
                 printf("%s %c \n", "Consonante: ", cod_cgn[c++]);
         }
     }
     /* Ricorda di restituire "al sistema" la memoria
      * ottenuta con malloc. */
     free(vocali);
     free(cod_cgn);
     printf("\n\n\n");
}
int main(void) {
     char *cognome1 = "Bianchi";
     clc_cognome(cognome1);
     /* spazio bianco contato come consonante? */
     char *cognome2 = "Della Casa";
     clc_cognome(cognome2);
     /* apostofro contato come consonante? */
     char *cognome3 = "D'Onofrio";
     clc_cognome(cognome3);
     char *cognome4 = "";
     clc_cognome(cognome4);
     return 0;
}
-- 
Non puoi insegnare qualcosa ad un uomo. You cannot teach a man anything.
Lo puoi solo aiutare   --  Galileo  Galilei  --   You can only help him
a scoprirla dentro di s�.                        discover it in himself.
Vincenzo Mercuri

 for (int i = 0, v = 0, c = 0; i < strlen(cgn); i++) {
[...]
Oops, in realt� avrei voluto scrivere:
      for (size_t i = 0, v = 0, c = 0; i < strlen(cgn); i++) {


 Vincenzo Mercuri
Grazie poi lo provo! L'uso dei puntatori è sconsigliato?
Comunque è il calcolo del codice cognome per il codice fiscale :)

 Comunque � il calcolo del codice cognome per il codice fiscale :)
No non intendevo che � sconsigliato, solo che la sintassi con array e
indici � molto pi� snella e i compilatori moderni producono lo stesso
codice che si tratti di puntatori o indici, specie dopo ottimizzazione.
Comunque con una breve ricerca  su internet penso che puoi trovare
algoritmi per calcolare il codice fiscale. Nel caso pi� tardi posso
darti qualche dritta in pi�. ;-)
-- 
Non puoi insegnare qualcosa ad un uomo. You cannot teach a man anything.
Lo puoi solo aiutare   --  Galileo  Galilei  --   You can only help him
a scoprirla dentro di s�.                        discover it in himself.
Vincenzo Mercuri

 Vincenzo Mercuri
Grazie ma è solo per scopo didattico.. è un esempio di software per
imparare il c :)

 Vincenzo Mercuri
Niente per la miseria! Non avvalora l'array! mentre cgn[i] è
correttamente avvalorato!

 correttamente avvalorato!
Credo di aver tralasciato '\0' negli array allocati, ma,
a parte questo, cosa vuol dire "avvalorare un array"?
-- 
Non puoi insegnare qualcosa ad un uomo. You cannot teach a man anything.
Lo puoi solo aiutare   --  Galileo  Galilei  --   You can only help him
a scoprirla dentro di s�.                        discover it in himself.
Vincenzo Mercuri

 Vincenzo Mercuri
Nel senso che non assegna nessun dato all'array di destinazione..

             }
ciao.
Qui commetti un errore: stampi vocali[cnt_vocali]
*dopo* aver gia' incrementato cnt_vocali quindi non stampi
lo stesso carattere che hai assegnato.
Inverti le due istruzioni:
vocali[cnt_vocali] = cgn[i];
printf("Vocali: %c \n", vocali[cnt_vocali] );
cnt_vocali++;
stesso problema sull'else dove tratti le consonanti.
ciao
Giacomo

 Nel senso che non assegna nessun dato all'array di destinazione..
E io avrei giurato di si...
Il punto � che dipende dalla "vita" che deve avere l'array di destina-
zione, e soprattutto qual � l'array in questione. Prova a postare
qualcos'altro, come per esempio la tua funzione main, tanto per avere
un'idea di come dev'essere chiamata l'altra funzione. Se hai un tuo
file completo e compilabile ancora meglio. Scusa se ti sembro osses-
sivo, ma non capisco bene cosa vuoi che faccia il tuo programma.
-- 
Non puoi insegnare qualcosa ad un uomo. You cannot teach a man anything.
Lo puoi solo aiutare   --  Galileo  Galilei  --   You can only help him
a scoprirla dentro di s�.                        discover it in himself.
Vincenzo Mercuri

On 15 Ott, 10:41, Giacomo Degli Esposti

E' vero!! Grazie mille..grazie anche a te vincenzo :)

 E' vero!! Grazie mille..grazie anche a te vincenzo :)
Figurati, avremmo potuto aiutarti di pi�. Occhio al valore di ritorno
della funzione, forse intendevi restituire un char * invece che solo
char, e forse questo giustifica il perch� non avevi ancora liberato lo
spazio allocato da malloc.
Consiglio: quando si tratta di funzioni che lavorano su stringhe e
caratteri, fai dei test man mano che sviluppi l'algoritmo, cos� da non
trovare troppo sorprese alla fine, in modo che il lavoro di ricucitura
non sar� troppo oneroso, e assicurati di prendere in considerazione
tutti i casi possibili, anche quelli pi� estremi e apprentemente
improbabili. Almeno gestiscili con messaggi di errore, fai in modo che
il tuo codice sia robusto e a prova di bomba.
(Naturalmente questo vale per tutti i tipi di algoritmi, non solo
  stringhe...)
PS: Familiarizza con la libreria <ctype.h>, insieme a <stdlib.h> e
     <string.h> puo' tornarti molto utile nel processare stringhe.
