PDA

View Full Version : [C] Esercizio su stringhe


xbubbax
24-07-2007, 09:08
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

recoil
24-07-2007, 10:17
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

AngeL)
24-07-2007, 10:31
http://www.hwupgrade.it/forum/showthread.php?p=14647777#post14647777
:D

recoil
24-07-2007, 10:34
hanno fantasia quelli che danno sti esercizi eh :asd:

Furla
24-07-2007, 10:35
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.

xbubbax
24-07-2007, 10:40
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?

recoil
24-07-2007, 10:46
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

xbubbax
24-07-2007, 10:51
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ò?

xbubbax
24-07-2007, 10:56
vabbè ora provo a farlo con il ciclo,

xbubbax
24-07-2007, 10:59
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

xbubbax
24-07-2007, 11:04
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++;}

recoil
24-07-2007, 11:06
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;

xbubbax
24-07-2007, 11:07
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++;}

xbubbax
24-07-2007, 11:10
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++;}

xbubbax
24-07-2007, 11:30
ho provato a farlo anche in quest'altro modo, ditemi quale dei due è migliore, sempre se sono corretti

xbubbax
24-07-2007, 11:35
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++;}

xbubbax
24-07-2007, 11:47
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:

xbubbax
24-07-2007, 16:09
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()....

xbubbax
24-07-2007, 16:13
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

xbubbax
24-07-2007, 16:30
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

xbubbax
25-07-2007, 09:20
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 ;)

xbubbax
25-07-2007, 10:47
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?

xbubbax
25-07-2007, 10:53
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´ ?

xbubbax
25-07-2007, 11:08
ho aperto un altro thread, si chiama come questo e alla fine c'è scritto III parte

xam8re
27-07-2007, 12:12
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.
}