Oppure

Loading
18/01/11 16:22
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).


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:

#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);
	return 0;
}
// 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))
		return NULL;
		//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 18/01/11 16:26
aaa
18/01/11 17:07
Il Totem
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.
aaa
18/01/11 18:37
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.
aaa
18/01/11 20:56
crack001
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
aaa
19/01/11 0:34
ramy1989
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:

int counter=0;
int inizio;
while(counter<k)
{
    if(s[i]==' ' || s[i]=='\n' || s[i]=='.' || s[i]==',')
    {
        counter++;
        inizio=i;
    }
    else if(s[i]=='
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:

int counter=0;
int inizio;
while(counter<k)
{
    if(s[i]==' ' || s[i]=='\n' || s[i]=='.' || s[i]==',')
    {
        counter++;
        inizio=i;
    }
    else if(s[i]=='{parsed_message}')
        break;
}

if(counter<k)
    return NULL;
else
{
    int copia=s[i-1];
    s[i-1]='{parsed_message}';
    strcpy(w,s[inizio]);
    s[i-1]=copia;
}
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:

int copia=s[k];
s[k]='{parsed_message}';
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.') break; } if(counter<k) return NULL; else { int copia=s[i-1]; s[i-1]='
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:

int counter=0;
int inizio;
while(counter<k)
{
    if(s[i]==' ' || s[i]=='\n' || s[i]=='.' || s[i]==',')
    {
        counter++;
        inizio=i;
    }
    else if(s[i]=='{parsed_message}')
        break;
}

if(counter<k)
    return NULL;
else
{
    int copia=s[i-1];
    s[i-1]='{parsed_message}';
    strcpy(w,s[inizio]);
    s[i-1]=copia;
}
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:

int copia=s[k];
s[k]='{parsed_message}';
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.'; strcpy(w,s[inizio]); s[i-1]=copia; } 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:

int copia=s[k];
s[k]='
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:

int counter=0;
int inizio;
while(counter<k)
{
    if(s[i]==' ' || s[i]=='\n' || s[i]=='.' || s[i]==',')
    {
        counter++;
        inizio=i;
    }
    else if(s[i]=='{parsed_message}')
        break;
}

if(counter<k)
    return NULL;
else
{
    int copia=s[i-1];
    s[i-1]='{parsed_message}';
    strcpy(w,s[inizio]);
    s[i-1]=copia;
}
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:

int copia=s[k];
s[k]='{parsed_message}';
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.'; 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 19/01/11 0:38
aaa
19/01/11 18:06
Pitagora
una è questa:
#include <stdio.h>
#include <string.h>

int main (void) {
	char stringa1[] = "Prova commento!";
	char stringa2[20];
	strncpy(stringa2, stringa1, 5);
	stringa2[5] = 'una è questa:

#include <stdio.h>
#include <string.h>

int main (void) {
	char stringa1[] = "Prova commento!";
	char stringa2[20];
	strncpy(stringa2, stringa1, 5);
	stringa2[5] = '{parsed_message}';
	printf("%s\n", stringa2);
	return 0;
}

un altro esempio è questo:
#include <stdio.h>

void copy_n (char *, char *, int);

int main (void) {
	char stringa1[] = "Prova commento!";
	char stringa2[20];
	copy_n (stringa1, stringa2, 5);
	printf("%s\n", stringa2);
	return 0;
}

void copy_n (char *src, char *dest, int k) {
	int i;
	for (i = 0; i != k; i++) {
		dest[i] = src[i];
	}
	dest[k] = '{parsed_message}';
	return;
}

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! ;)'; printf("%s\n", stringa2); return 0; }

un altro esempio è questo:
#include <stdio.h>

void copy_n (char *, char *, int);

int main (void) {
	char stringa1[] = "Prova commento!";
	char stringa2[20];
	copy_n (stringa1, stringa2, 5);
	printf("%s\n", stringa2);
	return 0;
}

void copy_n (char *src, char *dest, int k) {
	int i;
	for (i = 0; i != k; i++) {
		dest[i] = src[i];
	}
	dest[k] = 'una è questa:

#include <stdio.h>
#include <string.h>

int main (void) {
	char stringa1[] = "Prova commento!";
	char stringa2[20];
	strncpy(stringa2, stringa1, 5);
	stringa2[5] = '{parsed_message}';
	printf("%s\n", stringa2);
	return 0;
}

un altro esempio è questo:
#include <stdio.h>

void copy_n (char *, char *, int);

int main (void) {
	char stringa1[] = "Prova commento!";
	char stringa2[20];
	copy_n (stringa1, stringa2, 5);
	printf("%s\n", stringa2);
	return 0;
}

void copy_n (char *src, char *dest, int k) {
	int i;
	for (i = 0; i != k; i++) {
		dest[i] = src[i];
	}
	dest[k] = '{parsed_message}';
	return;
}

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! ;)'; return; }

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 19/01/11 18:07
aaa