|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
[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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
|
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 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
|
hanno fantasia quelli che danno sti esercizi eh
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
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: Codice:
char* EOS(char* str)
{
while(*str) str++;
return str;
}
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. Ultima modifica di Furla : 24-07-2007 alle 10:41. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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? |
|
|
|
|
|
#7 | |||
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
|
Quote:
pensavo fosse un "compito a casa" per un qualche esame e che usassero sempre le stesse tracce Quote:
s1[x + i] = s2[i] Quote:
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 |
|||
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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ò? |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
vabbè ora provo a farlo con il ciclo,
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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 |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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++;} |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
|
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; |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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++;} |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Il programma fino ad ora è questo
Codice HTML:
#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++;}
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ho provato a farlo anche in quest'altro modo, ditemi quale dei due è migliore, sempre se sono corretti
Ultima modifica di xbubbax : 24-07-2007 alle 11:35. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Codice HTML:
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++;}
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
fate finta di non averl letto i messaggi precedenti, ho provato a fare il programma completo
ditemi se potrebbe funzionare Codice HTML:
#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;} |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Codice:
#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;
}
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Manca ancora qualcosa, visto che la funzione deve copiare AL MASSIMO n caratteri...
__________________
In God we trust; all others bring data |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
for( i = 0; i < n; i++ )
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:50.




















