PDA

Visualizza la versione completa : [C] Funzione strncat()


SeeKeD
17-11-2006, 19:47
Ciao a tutti, ho un problema con questo programma:

#include <stdio.h>
#include <string.h>

char *strncat (char *, const char *, int );

main() {

char stringa1[100], stringa2[100];
int x;

scanf("%s", stringa1);
scanf("%s", stringa2);
scanf("%d", &x);

printf("%s", *strncat(stringa1, stringa2, x));

return 0;
}

char *strncat (char *s1, const char *s2, int n) {

printf("strncat(s1, s2, n) = %s\n", strncat(s1, s2, n));
}

Compilandolo mi da [Warning] conflicting types for built-in function `strncat', non riesco a capire dove sia l'errore (o gli errori :dhò: )
Ovviamente il programma viene eseguito ma non funziona correttamente, la funzione strncat dovrebbe prendere n caratteri dalla stringa s2 alla fine della stringa s1, praticamente appende a s1 gli n caratteri di s2, il primo carattere di s2 va a sovrascrivere il carattere \0 di terminazione della stringa s1. Grazie per l'aiuto

Samuele_70
17-11-2006, 20:06
Esiste già una funzione con quel nome definita nell'header string.h.
Cambia il nome alla tua funzione.

Attenzione : La tua funzione, richiama continuamente se stessa, e va in loop infinito !
( inoltre non restituisce nessun puntatore a char )

SeeKeD
17-11-2006, 20:45
Si ho capito, in effetti utilizzando la funzione esistente della libreria string.h mi basterebbe scrivere così:

#include <stdio.h>
#include <string.h>

main() {

char stringa1[100], stringa2[100];
int x;

scanf("%s", stringa1);
scanf("%s", stringa2);
scanf("%d", &x);

printf("%s", strncat(stringa1, stringa2, x));

return 0;
}

in effetti io dovrei riscrivere la funzione da zero, per esempio:
char *_strncat_(char *s1, const char *s2, int n);
dopodichè restituire alla fine il valore di _strncat_
giusto?

Samuele_70
17-11-2006, 20:58
Bene, nella tua funzione _strncat_ :)
Dovresti come prima cosa cercare la fine della stringa s1, ( puoi usare la strlen() )
e da qui inizi ad accodare i primi n caratteri di s2, con un ciclo for() del tipo :

int i
for( i=0; i<n && s2[i]!='\0'; i++)

Lak3d
18-11-2006, 00:14
char str1[10]="ab";
char str2[5]="cdefg";
char *s;

s=mystrncat(str1, str2, 3);
printf("%s", s);


char *mystrncat(char *s1, const char *s2, int l){
int last, i;

last=strlen(s1);
for(i=0; i<l && s2[i]!='\0'; i++)
s1[last++]=s2[i];
s1[last]='\0';
return s1;
}

SeeKeD
18-11-2006, 13:22
Mi sorge una curiosità, ma se la stringa che volessi immettere non ha necessariamente una dimensione predefinita?

char stringa1[100] , stringa2[100];

Ovviamente se all'inizio del mio programma non inserisco la dimensione massima della stringa mi da errore, dicendomi di non aver inserito nessun valore nell'inizializzazione delle stringhe...

è possibile non dare un valore predefinito dell'array, o comunque un valore variabile in base alla stringa che si inserisce?

Altrimenti sarei costretto ad inserire un valore il più grande possibile negli array in modo da soddisfare stringhe di qualsiasi dimensione...

pgnvni
18-11-2006, 23:57
Eppure è strano io non uso strncat() ma uso strcat() senza la 'n'...

oregon
19-11-2006, 00:23
Originariamente inviato da pgnvni
Eppure è strano io non uso strncat() ma uso strcat() senza la 'n'...

In che senso "è strano"?

Sono due funzioni diverse ...

SeeKeD
19-11-2006, 03:34
Originariamente inviato da pgnvni
Eppure è strano io non uso strncat() ma uso strcat() senza la 'n'...

Be in effetti sono due funzioni diverse, quella che dici tu cioè "strcat()" accoda praticamente la stringa s2 al vettore s1. In questo caso il primo carattere di s2 si sostituisce al NULL di terminazione di s1, rstituendo come valore finale il valore di s1.

Mentre la funzione "strncat " accoda un massimo di n caratteri dalla stringa s2 al vettore s1, sostituendo successivamente il primo carattere di s2 con il NULL di terminazione di s1 come succedeva nella precedente funzione, infine restituisce il valore di s1.

Come vedi sono due funzioni molto simili fra loro per la manipolazione delle stringhe incluse nella libreria <string.h>

LeleFT
19-11-2006, 17:03
Originariamente inviato da SeeKeD
Mi sorge una curiosità, ma se la stringa che volessi immettere non ha necessariamente una dimensione predefinita?

char stringa1[100] , stringa2[100];

Ovviamente se all'inizio del mio programma non inserisco la dimensione massima della stringa mi da errore, dicendomi di non aver inserito nessun valore nell'inizializzazione delle stringhe...

è possibile non dare un valore predefinito dell'array, o comunque un valore variabile in base alla stringa che si inserisce?

Altrimenti sarei costretto ad inserire un valore il più grande possibile negli array in modo da soddisfare stringhe di qualsiasi dimensione...
Per questo problema devi utilizzare l'allocazione dinamica degli array, utilizzando i puntatori.
Fai una ricerca sul forum, la questione è stata già trattata parecchie volte.


Ciao. :ciauz:

Loading