Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Salve ragazzi, ho problemi con un programmino, vi mostro la traccia:
Codice sorgente - presumibilmente C#
Scrivere una funzione, char*strw(char*s, int k, char*w), che copia la k-esima parola contenuta nella stringa s in w, come stringa, e ritorna il puntatore w. Se s contiene meno di k parole, allora la funzione ritorna NULL(NULL è una costante in stdlib.h che rappresenta un indirizzo non valido).
Ora...io avevo pensato di contare le parole della stringa S per effettuare i vari controlli con la funzione conta(), e poi "esplorare la stringa, e alla k-esima parola iniziare a copiare i caratteri di questa parola nell'altra stringa fino allo spazio successivo quindi fine parola...ho tirato giu questo codice:
Codice sorgente - presumibilmente C++
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char*strw(char*s,int k,char*w);
int conta(char*s);
int main(void){
char*string1="ciao a tutti quanti";
char string2[10];
int k=3;
char*ptr;
ptr=strw(string1,k,string2);
int i;
printf("%c\n", *ptr);
return0;
}
// Conto il numero di parole che contiene la stringa 'string1'
int conta(char*s){
int i=0,word=1,lung;
lung=strlen(s);
if(lung>0){
for(i=0;i<lung;i++){
if(s[i]==' ')
word+=1;
}
}
else
return-1;
return word;
}
char*strw(char*s,int k, char*w){
int i,j,r,lung=0,word=1;
lung=strlen(s);
// effettuo controlli di stringa vuota e di k maggiore a parole della stringa
if(conta(s)==-1)
printf("La stringa è vuota\n");
if(k>conta(s))
returnNULL;
//esploro la stringa
for(i=0;i<lung;i++){
if(s[i]==' '){
word+=1;
/*se il carattere è uno spazio incremento
un contatore, e lo confronto con k, quando sono uguali
inizio la copia nella stringa w*/
if(word==k){
r=0;
for(j=i+1;s[j]!=' ';j++){
w[r]=s[j];
r++;
}
}
}
}
return w;
}
il programma dovrebbe ritornare un puntatore alla stringa W...visto che w è un vettore di caratteri e quindi punta al suo primo elemento faccio "return w"...quando mando la stampa dal main del contenuto del puntatore, nel caso in cui la stringa s è "ciao a tutti quanti" e k=3 mi stampa solo "t"...quando invece dovrebbe stamparmi "tutti" cioè l'intera parola...sicuramente sbaglio qualcosa o con i puntatori o con la dichiarazione delle stringhe, non sono tanto il mio forte xD infatti sto cercando di esercitarmi il più possibile...confido nelle vostre risposte...illuminatemi
Ultima modifica effettuata da crack001 il 18/01/2011 alle 17:26
Ammettendo che l'algoritmo sia giusto, non puoi stampare una stringa con %c, devi usare %s e passare il puntatore al primo elemento della stringa (quindi ptr e non *ptr). E' la prima cosa su cui mi è balzato l'occhio.
un while generale che tiene conto di k. Dentro di esso una chiamato alla funzione strncpy passando come int il valore 1. Subito dopo la chiamata a strncpy un incremento del puntatore a char. Per risolvere questo esercizio devi avere una conoscienza solida della aritmetica dei puntatori e dei puntatori. Dal sources non penso che tu abbia queste basi. Totem mi ha anticipato.
un while generale che tiene conto di k. Dentro di esso una chiamato alla funzione strncpy passando come int il valore 1. Subito dopo la chiamata a strncpy un incremento del puntatore a char. Per risolvere questo esercizio devi avere una conoscienza solida della aritmetica dei puntatori e dei puntatori. Dal sources non penso che tu abbia queste basi. Totem mi ha anticipato.
Ammetto le mie pesanti lacune su questo argomento, ma sul libro e sul manuale non ho trovato un gran che...ti dispiace scrivermi la funzione? almeno prendo come base ti studio il tuo codice, in modo da potermi esercitare, sempre se sei disponibile...sia chiaro
Postato originariamente da crack001: Salve ragazzi, ho problemi con un programmino, vi mostro la traccia:
Scrivere una funzione, char *strw(char *s, int k, char *w), che copia la k-esima parola contenuta nella stringa s in w, come stringa, e ritorna il puntatore w. Se s contiene meno di k parole, allora la funzione ritorna NULL (NULL è una costante in stdlib.h che rappresenta un indirizzo non valido).
Bè ragazzi,in generale eviterei frasi come "devi fare" perchè sicuramente ci saranno mille algoritmi possibili.
Suppongo che s punti a un testo molto lungo,quindi un modo per separare le parole sono gli spazi e i punti,io in genere queste cose le faccio senza usare funzioni della libreria tanto complesse.
Contare la k esima parola è facile: basta contare il k esimo spazio,usi un contatore che aumenta quando incontra uno spazio,un punto o una virgola.
Poi se se il testo è letto da file capace che ci sono anche le newline.
Poi lo faccio tenendo conto che il k esimo spazio si riferisce alla dimensione,che è [k-1].
Puoi fare una cosa del genere:
Bè mi sono un pò lasciato prendere e l' ho scritta tutta,non ti consiglio di fare copia e incolla comunque.
se tu hai un testo lunghissimo ti insegno un trucco per copiare una parte del testo:
facciamo finta che s è un testo chilometrico,vuoi copiare dalla lettera n alla lettera k,allora fai:
Codice sorgente - presumibilmente C/C++
int copia=s[k];
s[k]='\0';
strcpy(s[n],w);
s[k]=copia;
La strcpy si ferma quando incontra il terminatore,però poi devi rimettere apposto le cose:per questo crei una copia,s[n] te la conta come una stringa a se stante,poi però quel terminatore va tolto e va rimesso il carattere che hai tenuto nella variabile di copia.
Ultima modifica effettuata da ramy1989 il 19/01/2011 alle 1:38