Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Copiare parola di una stringa
Forum - C/C++ - Copiare parola di una stringa

Avatar
crack001 (Normal User)
Rookie


Messaggi: 52
Iscritto: 25/10/2007

Segnala al moderatore
Postato alle 17:22
Martedì, 18/01/2011
Salve ragazzi, ho problemi con un programmino, vi mostro la traccia:

Codice sorgente - presumibilmente C#

  1. 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++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. char *strw(char *s,int k,char *w);
  6. int conta(char *s);
  7.  
  8. int main(void){
  9.         char *string1="ciao a tutti quanti";
  10.         char string2[10];
  11.         int k=3;
  12.         char *ptr;
  13.         ptr=strw(string1,k,string2);
  14.         int i;
  15.         printf("%c\n", *ptr);
  16.         return 0;
  17. }
  18. // Conto il numero di parole che contiene la stringa 'string1'
  19. int conta(char *s){
  20.         int i=0,word=1,lung;
  21.         lung=strlen(s);
  22.         if(lung>0){
  23.                 for(i=0;i<lung;i++){
  24.                         if(s[i]==' ')
  25.                                 word+=1;
  26.                 }
  27.         }
  28.         else
  29.                 return -1;
  30.         return word;
  31. }
  32.  
  33. char *strw(char *s,int k, char *w){
  34.         int i,j,r,lung=0,word=1;
  35.         lung=strlen(s);
  36.         // effettuo controlli di stringa vuota e di k maggiore a parole della stringa
  37.         if(conta(s)==-1)
  38.                 printf("La stringa è vuota\n");
  39.         if(k>conta(s))
  40.                 return NULL;
  41.                 //esploro la stringa
  42.         for(i=0;i<lung;i++){
  43.                 if(s[i]==' '){
  44.                         word+=1;
  45.                         /*se il carattere è uno spazio incremento
  46.                         un contatore, e lo confronto con k, quando sono uguali
  47.                         inizio la copia nella stringa w*/
  48.                         if(word==k){
  49.                                 r=0;
  50.                                 for(j=i+1;s[j]!=' ';j++){
  51.                                         w[r]=s[j];
  52.                                         r++;
  53.                                 }
  54.                         }
  55.                 }
  56.         }
  57.         return w;
  58. }



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
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:07
Martedì, 18/01/2011
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.

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 19:37
Martedì, 18/01/2011
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.

PM Quote
Avatar
crack001 (Normal User)
Rookie


Messaggi: 52
Iscritto: 25/10/2007

Segnala al moderatore
Postato alle 21:56
Martedì, 18/01/2011
Testo quotato

Postato originariamente da Pitagora:

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

PM Quote
Avatar
ramy1989 (Normal User)
Newbie


Messaggi: 10
Iscritto: 06/01/2011

Segnala al moderatore
Postato alle 1:34
Mercoledì, 19/01/2011
Testo quotato

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:

Codice sorgente - presumibilmente C++

  1. int counter=0;
  2. int inizio;
  3. while(counter<k)
  4. {
  5.     if(s[i]==' ' || s[i]=='\n' || s[i]=='.' || s[i]==',')
  6.     {
  7.         counter++;
  8.         inizio=i;
  9.     }
  10.     else if(s[i]=='\0')
  11.         break;
  12. }
  13.  
  14. if(counter<k)
  15.     return NULL;
  16. else
  17. {
  18.     int copia=s[i-1];
  19.     s[i-1]='\0';
  20.     strcpy(w,s[inizio]);
  21.     s[i-1]=copia;
  22. }
  23. return copia;



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++

  1. int copia=s[k];
  2. s[k]='\0';
  3. strcpy(s[n],w);
  4. 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
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 19:06
Mercoledì, 19/01/2011
una è questa:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main (void) {
  5.         char stringa1[] = "Prova commento!";
  6.         char stringa2[20];
  7.         strncpy(stringa2, stringa1, 5);
  8.         stringa2[5] = '\0';
  9.         printf("%s\n", stringa2);
  10.         return 0;
  11. }


un altro esempio è questo:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. void copy_n (char *, char *, int);
  4.  
  5. int main (void) {
  6.         char stringa1[] = "Prova commento!";
  7.         char stringa2[20];
  8.         copy_n (stringa1, stringa2, 5);
  9.         printf("%s\n", stringa2);
  10.         return 0;
  11. }
  12.  
  13. void copy_n (char *src, char *dest, int k) {
  14.         int i;
  15.         for (i = 0; i != k; i++) {
  16.                 dest[i] = src[i];
  17.         }
  18.         dest[k] = '\0';
  19.         return;
  20. }


Poi c'è anche l'esempio che ti ho descritto io al 3° post...
... ma ce ne sono moltissimi :rotfl:

P.S. spero di aver fatto la cosa giusta, scrivendoti la funzione! Sono convinto che non ne approfitterai bensì studierai e tenterai di capire! ;)

Ultima modifica effettuata da Pitagora il 19/01/2011 alle 19:07
PM Quote