View Full Version : [C] Esercizio su stringhe
Qualcuno mi da un idea su come procedere per fare questo esercizio
Io qualche idea ce l'ho ma non so come applicarla. Ad esempio ho pensato di prendere gli n caratteri della stringa s2 e di attaccarli alla fine della stringa s1, ma non so come farlo in C
Si scriva una funzione
char _strncat_(char *s1, const char *s2, int n)
tale funzione appende al massimo n caratteri della stringa s2 alla stringa s2.
Ad esempio se
s1=pippo
s2=pluto
n=3
output=pippoplu
non è difficile
per prima cosa fai passare gli elementi di s1 (inteso come array di char) fino ad arrivare allo 0 che indica la fine della stringa
da quel punto in avanti fai un ciclo con i che va da 0 a n-1 nel quale copi l'i-esimo carattere di s2 nella posizione x + i di s1, dove x è la posizione in cui hai trovato lo zero, ossia la lunghezza della stringa
ti bastano un paio di cicli for
http://www.hwupgrade.it/forum/showthread.php?p=14647777#post14647777
:D
hanno fantasia quelli che danno sti esercizi eh :asd:
ciao, immagino tu sappia già cos'è una stringa in C e come viene rappresentata...
io mi sto divertendo a scrivere qualche funzione sulle stringhe, tipo quelle in <cstring>, devo dire che sono molto semplici da implementare. ti consiglio di dividere il problema in sottoproblemi più piccoli e semplici da risolvere, magari facendoti prima uno schema cartaceo.
inoltre le stringhe si adattano bene all'uso dell'aritmetica dei puntatori più che ad essere trattate come semplici array, ad esempio per avere il puntatore a fine stringa basta questo:
char* EOS(char* str)
{
while(*str) str++;
return str;
}
scrivi qualcosa da solo e se ti blocchi posta il codice, ti daremo volentieri una mano ;)
PS: EVITA di leggere soluzioni di altre persone, ci siamo passati tutti ed è importante cavarsela da soli, noi dovremmo solo farti notare i tuoi errori.
In che senso hanno fantasia? Questo esercizio l'ho trovato su un sito dell'università di roma e lo sto usando per esercitarmi, comq....
non ho capito quando dici copiare l'i-esimo carattere. come faccio a copiarlo?
poi un'altra cosa, il vettore s1 lo devo dichiarare con il numero di elementi necessari a memorizzare la stringa 1 oppure lo dichiaro con tanti elementi in modo da poterci "incollare" anche i caratteri di s2?
In che senso hanno fantasia? Questo esercizio l'ho trovato su un sito dell'università di roma e lo sto usando per esercitarmi, comq....
nel senso che era uguale ad un altro esercizio
pensavo fosse un "compito a casa" per un qualche esame e che usassero sempre le stesse tracce
non ho capito quando dici copiare l'i-esimo carattere. come faccio a copiarlo?
è un semplice assegnamento
s1[x + i] = s2[i]
poi un'altra cosa, il vettore s1 lo devo dichiarare con il numero di elementi necessari a memorizzare la stringa 1 oppure lo dichiaro con tanti elementi in modo da poterci "incollare" anche i caratteri di s2?
se devi limitarti a scrivere quella funzione non devi dichiarare il vettore s1, te lo ritrovi come parametro e vi accedi con le [ ] come ho scritto sopra. si suppone che ti arrivi un array abbastanza grande
se devi scrivere anche la funzione che chiama _strncat_ allora sì, devi dichiarere tu s1 e lo devi fare grande abbastanza per tenere quello che c'è in origine + n caratteri di s2 + 1 byte finale per mettere lo zero di fine stringa
char *_strncat_(char *s1, const chat *s2, int n){
void *memcpy(*s1, const *s2, n)
utilizzando questa funzione non è piu semplice?
come dovrei proseguire però?
vabbè ora provo a farlo con il ciclo,
char *_strncat_(char *s1, const chat *s2, int n){
for(;*s1!='\0';*s1++){
for(
ho scritto questo ma è sbagliato
cioè come faccio a dire, quando sei arrivato al carattere nullo copia gli elementi di s2 in quel punto?
è la cosa piu stupida che esiste ma non mi viene
Va bene una cosa del genere?
char *_strncat_(char *s1, const chat *s2, int n){
while(*s1!='\0'){
*s1++;}
for(;i=0;i<n;i++){
*s1=*s2;
*s2++;}
la memcpy fa un'altra cosa, copia n byte da s2 a s1 però non si posiziona alla fine della stringa, li copia all'inizio
per il resto fai un
for (i = 0; i < n; i++, s1++)
{
s2[i] = *s1;
}
s2[i] = 0;
Non ho capito se questo pezzetto è giusto o sbagliato
char *_strncat_(char *s1, const chat *s2, int n){
while(*s1!='\0'){
*s1++;}
for(;i=0;i<n;i++){
*s1=*s2;
*s2++;}
Il programma fino ad ora è questo
#include <stdio.h>
char *_strncat_(char *s1, const char *s2, int n); /*Prototipo della funzione*/
int main(){
char stringa1[40];
char stringa2[10];
int n;
prtint("Inserisci due stringhe minori di 10 caratteri e un numero intero:\n");
scanf("%s%s%d", &stringa1, &stringa2, &n);
char *_strncat_(char *s1, const chat *s2, int n){
while(*s1!='\0'){
*s1++;}
for(;i=0;i<n;i++){
*s1=*s2;
*s2++;}
ho provato a farlo anche in quest'altro modo, ditemi quale dei due è migliore, sempre se sono corretti
char *strncat(char *s1, const chat *s2, int n){
int lung;
lung = strlen(*s1);
for(i=0;i<n;i++){
s1[lung+1]=*s2;
lung += 1;
*s2++;}
fate finta di non averl letto i messaggi precedenti, ho provato a fare il programma completo
ditemi se potrebbe funzionare
#include <stdio.h>
#include <string.h>
char *strncat(char *s1, const char *s2, int n);
int main(){
char stringauno[30];
char stringadue[10];
int n;
printf("Inserisci due stringhe e un intero:\n");
scanf("%s%s%d", stringauno, stringadue, &n);
strncat(stringauno, stringadue, n);
printf("%s\n", stringauno);}
char *strncat(char *s1, const char *s2, int n){
int lung;
lung = strlen(*s1);
for(i=0;i<n;i++){
s1[lung+1]=*s2;
lung += 1;
*s2++;}
return *s1;}
trallallero
24-07-2007, 15:34
#include <stdio.h>
#include <string.h>
// se usi strncat ti da errore perche' la funzione esiste gia' nel .h che includi (string.h)
//char *strncat(char *s1, const char *s2, int n);
char *_strncat(char *s1, const char *s2, int n);
int main()
{
char stringauno[30];
char stringadue[10];
int n;
// ti conviene sempre azzerare le stringhe che utilizzi per eliminare le porcherie
memset( stringauno, 0, sizeof(stringauno) );
memset( stringadue, 0, sizeof(stringadue) );
printf("Inserisci due stringhe e un intero:\n");
scanf("%s%s%d", stringauno, stringadue, &n);
_strncat(stringauno, stringadue, n);
printf("%s\n", stringauno);
return 0; // il main ritorna int
}
char *_strncat(char *s1, const char *s2, int n)
{
int lung;
// strlen vuole il puntatore quindi s2 non *s2
//lung = strlen(*s1);
lung = strlen( s1);
// i dov'e' dichiarato ???
int i; // aggiunto io
for( i = 0; i < n; i++ )
{
// s1[lung] punta al terminatore della stringa
// s1[lung + 1] punta quindi al carattere dopo il terminatore
// quindi tutto cio' che aggiungi non lo vedrai mai perche' dopo lo \0
//s1[lung + 1] = *s2;
s1[lung] = *s2;
lung += 1;
// devi incrementare il puntatore non il valore
// anche se ti va bene lo stesso perche' * non ha la precedenza quindi
// in questo caso viene ignorato, ma in C e' rigoroso essere puliti ed ordinati
//*s2++;
s2++;
}
// la funzione deve tornare un puntatore quindi s1 non *s1
//return *s1;
return s1;
}
voto: 5-- :D
sottovento
24-07-2007, 15:40
Manca ancora qualcosa, visto che la funzione deve copiare AL MASSIMO n caratteri...
trallallero
24-07-2007, 15:49
Manca ancora qualcosa, visto che la funzione deve copiare AL MASSIMO n caratteri...
questo mica e´ li per bellezza :D
for( i = 0; i < n; i++ )
sottovento
24-07-2007, 15:55
questo mica e´ li per bellezza :D
for( i = 0; i < n; i++ )
Mi sembrava che quello copiasse ESATTAMENTE n caratteri, non AL MASSIMO :D
trallallero
24-07-2007, 16:05
Mi sembrava che quello copiasse ESATTAMENTE n caratteri, non AL MASSIMO :D
se vogliamo essere pignoli ci sono un po' di cose non controllate.
Se uno scrive ciao come prima parola e precipitevolissimevolmente come seconda, secondo me si sfascia :fiufiu:
si è normale che devo controllare e aggiungere alcune cose, però come procedimento piu o meno ci sono
oggi non ho tempo, domani cerco di postare la versione definitiva, se dio vuole:D
sottovento
24-07-2007, 16:11
se vogliamo essere pignoli ci sono un po' di cose non controllate.
Se uno scrive ciao come prima parola e precipitevolissimevolmente come seconda, secondo me si sfascia :fiufiu:
Veramente non volevo fare il pignolo, volevo solo far notare che manca ancora qualcosa per essere a specifica: si deve copiare fino ad un massimo di n caratteri. Ammesso, appunto, che la seconda stringa ne abbia almeno n. In caso non ne abbia, e' implicito che si copia solo quello che c'e'.
Questo e' il normale funzionamento delle funzioni strnxxxx()....
trallallero, tutti quei piccoli errori sono dovuti al fatto che sono 3 giorni che sto sui puntatori, ancora non li so usare bene
ho quasi 2 mesi per fare bene i puntatori, le liste e poi c'è l'esame
trallallero
24-07-2007, 16:16
Veramente non volevo fare il pignolo, volevo solo far notare che manca ancora qualcosa per essere a specifica: si deve copiare fino ad un massimo di n caratteri. Ammesso, appunto, che la seconda stringa ne abbia almeno n. In caso non ne abbia, e' implicito che si copia solo quello che c'e'.
Questo e' il normale funzionamento delle funzioni strnxxxx()....
si si, non era riferito a te :D
indendevo che gli ho corretto qualche errore ma se andiamo a scavare ... il voto scende :asd:
trallallero
24-07-2007, 16:17
trallallero, tutti quei piccoli errori sono dovuti al fatto che sono 3 giorni che sto sui puntatori, ancora non li so usare bene
ho quasi 2 mesi per fare bene i puntatori, le liste e poi c'è l'esame
ma si dai, lo immaginavo. E mica si nasce imparati ;)
buon divertimento ... e vedrai che quando li avrai imparati ad usare usciranno i puntatori a funzione, le triplette ***p :D
ho corretto quegli errori che mi hai segnalato.
stasera posto la versione definitiva aggiungendo quei casi particolari.
comq alla fine è un esercizio stupidissimo, fino a qualche tempo fa mi sembrava fantascienza
L'ho finito, senza guardare i vostri aiuti però mi da dei risultati non proprio esatti
ad esempio
1=ciao
2=bubba
n?2
output=ciaobuç$%
#include <stdio.h>
#include <string.h>
char *strncat(char *s1, const char *s2, int n);
int main(){
char stringauno[30];
char stringadue[10];
int n;
printf("Inserisci due stringhe e un intero:\n");
scanf("%s%s%d", stringauno, stringadue, &n);
strncat(stringauno, stringadue, n);
printf("%s\n", stringauno);
}
char *strncat(char *s1, const char *s2, int n){
int lung;
int lungdue;
int i;
lung = strlen(s1);
lungdue = strlen(s2);
if(n>lungdue){
n=lungdue;}
for(i=0;i<n;i++){
s1[lung]=*s2;
lung += 1;
s2++;}
return s1;}
trallallero
25-07-2007, 10:06
se cerchi tra i miei consigli nei commenti del codice che ti ho corretto, trovi la soluzione ;)
se ti riferisci al fatto di azzerare le stringhe mi sono dimenticato di metterlo,.
però anche se azzero le stringhe perchè il programma mi stampa anche tutti i caratteri della seconda stringa?
non dovrebbe fermarsi agli n?
hai ragione, funziona perfettamente...
mi dai una mano con gli altri 2, soprattutto col terzo (III parte), perchè gia l'ho fatto , si dovrebbe solo controllare
grazie
trallallero
25-07-2007, 11:03
hai ragione, funziona perfettamente...
mi dai una mano con gli altri 2, soprattutto col terzo (III parte), perchè gia l'ho fatto , si dovrebbe solo controllare
grazie
:eh: ? di quale III parte parli ? dov´e´ ?
ho aperto un altro thread, si chiama come questo e alla fine c'è scritto III parte
char *strncat(char *s1, const char *s2, int n)
{
int len=0;
len=strlength(*s1);
*s1=strcat(*s1,*s2);
s1[n+len]= "/0"; // occupi + memoria ma è + veloce.
}
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.