|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
iecchime qua!!: serch(char *p[], char *name)
ohh quà! sto giro forse è piu facile che mai ma....anch'io ho i miei limiti....
Sto giro mi vien data una funzione serch(char *p[], char *name)..in base alla quale devo determinare se un nome compare tra quelli elencati....in caso il nome ci sia deve restituire l'indice dell'array nel quale ha trovato il nome altrimenti -1 #include <stdlib.h> #include<stdio.h> #include<string.h> int search(char *p[], char *name) { } char*names[]={ "Alberto", "Luigi", "Daniele", "Giovanni", NULL}; /* la costante puntatore NULL conclude l'elenco */ int main(void) { if (search(names, "Daniele") != -1) /* names[2] */ printf("Daniele e' contenuto nell'elenco.\n"); if (search(names, "Dario") == -1) printf("Dario e' assente dall'elenco"); return 0; } system("PAUSE"); return 0; } Idee di tutti i tipi venghino a me....e a tutti coloro che ci capiscono qualcosa
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Utilizzare strcmp della libreria string.h?
Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
puff... pant...arf arf.....ci sto provando....ho partorito sta schifezza... non credo sia per niente giusta...ma come ragionamento potrebbe andare?!?
Codice:
...
for (ind=&p[0]; ind<=&p[DIM-1]; ind ++)
for (i=j=0; i<DIM-1;i++)
int strcmp ((*p[0])[i], (*name)[j]);
e se sono uguali fino alla fine ritorno l'indice scusate ma sono un po intrippato.... le parentesi sullo strcmp sono cannate quasi sicuramente... aiuuuuto
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
La strcmp e' una funzione che restituisce un intero uguale, maggiore o minore di zero.
Il caso che interessa a te e' quando questo valore di ritorno e' zero in quanto significa che le stringhe che hai passato come parametro sono uguali. Quindi dentro il for devi mettere una cosa del tipo if (strcmp(s1,s2)==0) ...bla bla bla s1 e s2 sono stringhe e non caratteri come mi sembra tu abbia erroneamente interpretato. Ci sono anche soluzioni piu' eleganti, ma preferisco dirti questa che e' la piu' semplice. Prova a pensarci un po' su, e se non risolvi ti scrivero' una possibile soluzione. Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
Quote:
Ho trovato un asoluzione un po piu fissa della cazzatissima che ho postato prima ..... Codice:
char str1 [10];
for (i=0; i<=DIM; i++) /*voglio scorrere tutti i nomi dell'array p[]*/
{strcpy (str1, *p[i])
strcpy (str2, *name)
if strcmp (str1, str2)==0
return i
else return -1}
mah mi sembra un po piu leggibile....ah entro mezzanotte devo farlo altrimenti mi trasformo in zucca....piu di quello che mi ritrovo!!! bah non è malvagio ora?!? almeno si capisce cosa vorrei fare!?!
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
aggiornamento:
Codice:
#include <stdlib.h>
#include<stdio.h>
#include<string.h>
#define DIM 4
int search(char *p[], char *name)
{
int i;
char str1 [10]; /*numero massimo di caratteri in str1*/
char str2 [10]; /*numero massimo di caratteri in str2*/
for (i=0; i<=DIM; i++) /*scorro tutti i 4 nomi di *p[]*/
{
strcpy (str1, *p[i]);
strcpy (str2, *name);
if (strcmp (str1, str2)==0)
return i;
else return -1;
}
}
char*names[]={
"Alberto",
"Luigi",
"Daniele",
"Giovanni",
NULL}; /* la costante puntatore NULL conclude l'elenco */
int main(void)
{
if (search(names, "Daniele") != -1) /* names[2] */
printf("Daniele e' contenuto nell'elenco.\n");
if (search(names, "Dario") == -1)
printf("Dario e' assente dall'elenco");
system("PAUSE");
return 0;
}
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prova così :
Codice:
#include <stdlib.h>
#include<stdio.h>
#include<string.h>
//#define DIM 4
int search(char *p[], char *name)
{
int i = 0;
while(p[i] != NULL) /*scorro tutti i nomi di fino al NULL*/
{
if (strcmp (p[i++], name)==0)
return i;
/*else return -1; questo non ci vuole...altrimenti fa un solo controllo */
}
return -1;
}
char*names[]={
"Alberto",
"Luigi",
"Daniele",
"Giovanni",
NULL}; /* la costante puntatore NULL conclude l'elenco */
int main(void)
{
if (search(names, "Daniele") != -1) /* names[2] */
printf("Daniele e' contenuto nell'elenco.\n");
if (search(names, "Dario") == -1)
printf("Dario e' assente dall'elenco\n");
system("PAUSE");
return 0;
}
Le due stringhe temporanee non servivano a niente... C'era un * in più davanti p[i]... Nota il post incremento nella strcmp... E' quello che fa avanzare i... La sai la differenza fra preincremento e postincremento ? int a = 0, b; b = a++; /*b va a zero perchè l'incremento avviene solo dopo la fine della riga*/ b = ++a; /*a ora è 1 e la preincremento e b vale 2*/ b = ++a; equivale a b = (a = a + 1); b = a++; equivale a b = a; ++a; |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
Quote:
aspetta...c'e qualcosa che non mi torna.... 1° se inizializzo i=0 e poi confronto p[i++] con name vuol dire che confronto p[0] con name e poi incremento i che diventa 1....ma così allora ritorno 1 non 0.... 2° perche confronto con name? cosa sta ad indicare name? ...è un puntatore a carattere che deve ricevere come valore un indirizzo di memoria....ma...ma...non mi capisco più....e poi il parametro attuale nel mai gli passa "Daniele" perchè? "Daniele" è una stringa non un indirizzo di memoria.... azzz....sto facendo casino!! sbrogliami sto dubbio!!
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
Hai altre idee? modi diversi di vedere sto ambaradan? faceva proprio schifo il mio aggiornamento..?
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quote:
Per la precisione le stringhe specificate tra apici sono di tipo char []... Allora perchè strcpy(str, "ciao"); funziona secondo te ? Proprio perchè "ciao" è un char []... Senza contare l'allocazione di una stringa... char str[] = "ciao"; Secondo te perchè funziona una cosa del genere ? Proprio perchè "ciao" è di tipo char []... Assegni ad un puntatore di tipo char [] un altro char []... name punta ad una stringa e p[i] punta ad una stringa perchè non dovrei confrontarli ? |
||
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Qualche ulteriore miglioramento può essere fatto nella search...
Ma è solo una questione di stile : Codice:
int search(char *p[], char *name)
{
int i = 0;
while(p[i]) /*scorro tutti i nomi di fino al NULL*/
{
if(!strcmp(p[i], name))
return i;
++i;
}
return -1;
}
if(a) equivale a if(a != 0) NULL in quasi tutti i linguaggi equivale a 0... Ti voglio porre un quesito... Come fai a far ritornare più di un valore ad una funzione ? Ad esempio...devi cercare le prime 3 occorrenze di una lettera all'interno di una stringa... Fammi la funzione che svolge fa cosa... |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
Quote:
bhe...una funzione restituisce un unico valore, ma tramite i puntatori posso farne ritornare una buona caterba... è questo che mi domandavi? ....non ho capito il tuo quesito...ho una stringa e devo fare una funzione per...?....data una stringa vedere quali caratteri si ripetono per 3 volte all'interno della stessa?
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Vabbè...allora se sapevi che si poteva fare con i puntatori non c'è gusto
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
Aspetta dammi un aggiornamento...
dire name è come dire name[0]....non &name[0] &name[0] restituisce l'indirizzo di memoria di name[0] (e perciò di tutto l'array) se voglio assegnare una serie di valori ad un array devo farlo con un ciclo for ad esempio...non c'e modo di passare l'inidirzzo della prima cella dell'array e lassegnamento avviene consecutivamente per tutti i valori ?!? non ricordo che cosa indicava su un vecchio esercizio ....scanf ("%[^\n]", riga) ?!? dato char riga[80]
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
name è come dire &name[0]...
Perchè name è già il puntatore al primo elemento del vettore... scanf ("%[^\n]", riga) significa che leggi tutti i caratteri fino a quando non incontri uno \n... |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
Quote:
int search(char *p[], char *name) {...... ....... if(!strcmp(p[i], name)) spetta che adesso sono veramente in aceto... char*p[] indica un array di nomi (che sono array di caratteri,ma qusto a me importa relativamente) char *name essendo un puntatore ad una stringa (es "davide")...punta al primo elemento della stringa cioè a'd' nel momento in cui confronto p[i] con name, sto confrontando la stringa contenuta in p[i] (es "alberto") con name che è l'indirizzo di memoria del primo elemento dell'array di caratteri a cui punta(cioè &name[0]come mi hai fatto notare) (cioè 'd' di "davide").... ma a ragion di logica farei un confronto tra una stringa ed un carattere...mmm a meno che name (e/o name[0]) puntando a "davide" non restituisca per intero il "davide" (come credo)...ma non dovrebbe essere allora *name?cioè il contenuto di cio a cui punta name...
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
Codice:
[i] scanf ("%[^\n]", riga) significa che leggi tutti i caratteri fino a quando non incontri uno \n [/i] quindi posso mettere altri caratteri di tabulazione al posto di \n....anche \0?
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jan 2002
Città: VENICE
Messaggi: 1241
|
Provo a spiegarmi meglio....
Codice:
main()
{...
search(names,"daniele");
...}
int search (char *p[], char *name)
{...
strcmp (p[i], name);
...}
di conseguenza capivo meglio che str passava a name l'indirizzo str (e/o &str[0])... ma anche se fosse così mi sorge un dubbio...quando faccio il confronto....lo faccio tra la stringa in p[i] e name che è str(e/o &str[0]) ma quest'ultimo str (e/o &str[0]) è un indirizzo non il contenuto dell'array... spero di aver spiegato meglio qual'e il mio dubbio... e poi passando come parametro attuale "daniele" che indirizzo viene passato a name?!?(credo &...[0]l'indirizzo in cui vi è 'd') cioe viene creato da se stesso l'array che contiene i caratteri 'd' 'a' 'n' 'i' 'e' 'l' 'e'? e che nome ha? dato che ho messo... devo seguire anche un corso di italiano all'unive... e si che alle superiori ero na macchina nei temi...
__________________
...Fight with your heart, and you're Destined For Glory But fight without soul and you will loose it all... |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Cerco di farti capire meglio...
...anche p[i] è un char *...e punta la primo elemento dell'i-esimo nome... Nota che la dichiarazione di strcmp è questa : int strcmp(char *, char *); Un vettore è sempre identificato dal suo puntatore... Altrimenti come potresti identificarlo ? Se io dichiaro: int v[10]; In ciò che si chiama v non sono contenuti tutti gli elementi del vettore, ma v è il puntatore al primo elemento del vettore... Prova ad accedere ad *v e vedrai che è il primo elemento del vettore... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:36.



















