|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
[C] problemi con stringhe
Allora, nel sorgente dichiaravo e inizializzavo le stringhe così:
Codice:
char* stringa; (..) stringa="abcdefg"; Quello che poi si deve fare con la stringa è: - memorizzarla all'interno di una struct (e sarebbe opportuno che la stringa abbia una lunghezza corretta, dato che allocandola in memoria devo per forza specificare un valore massimo) - passarla come parametro in una funzione e fare operazioni di confronto con altre stringhe (magari prese da altre struct). Qualche idea?
__________________
ka0s |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Attento che un comportamento del genere può portare a degli errori grossolani...
Ad esempio: Codice:
void foo(char *s)
{
s = "abcdefgh";
}
Ricordati che devi sempre allocare lo spazio per le stringhe su cui deve lavorare, ci sono pochi casi in cui ti basta che il puntatore punti alla costante stringa... Se fai così: char *s = "abcdefgh"; s punta alla costante stringa, ma non potrai mai utilizzare s per contenere altre stringhe, in quanto è un semplice puntatore. Quindi ricordati sempre di allocare la memoria necessaria per contenere le stringhe...o in maniera statica: char s[] = "abcdefgh"; //ti allocherà un char s[9] o in maniera dinamica: char *s; ... s = (char *)malloc(9 * sizeof(char)); strcpy(s, "abcdefgh"); In quest'ultimo modo puoi anche allocare le stringhe per le strutture... |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
Grazie mille per la spiegazione!!
Per il programma che sto facendo ora non c'è bisogno di modificare le stringhe una volta definitive... l'unica cosa che devo farci è usarle con le strutture e fare eventuali confronti con altre stringhe di altre strutture... usando strcpy(s, "abcdefgh"); come si fa ad allocarle per le strutture? cioè dopo aver fatto questo la stringa è allocata, ma come gli dico di metterla in un campo della struttura? Ad es. se la struttura fosse una cosa del genere: Codice:
typedef struct {
int a,b;
ecc. ecc.
char *s; /* è giusto farla cosi? non credo... dopo come si fa quindi? */
} Struttura;
__________________
ka0s |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Questo però non vuol dire che non si possa fare. Ecco una semplice funzione che ho appena fatto che fa proprio questo: tu gli passi uno stream (anche stdin, volendo) e la funzione espande man mano il suo buffer di lettura fin quanto è necessario. Alla fine restituisce un puntatore ad una area di memoria grande esattamente (se possibile) quanto basta per la stringa. Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *read_line_string (FILE *f)
{
int block = 256;
int capacity = 0, len = 0;
char *buf = NULL, *p;
do {
capacity += block;
p = (char*) realloc (buf, capacity);
if (p == NULL)
{
free (buf);
return NULL;
}
buf = p;
fgets (&buf[len], capacity-len, f);
if ((p = strchr (&buf[len], '\n')) != NULL)
*p = '\0';
len += (int) strlen (&buf[len]);
} while (p == NULL);
p = (char*) realloc (buf, len+1);
if (p != NULL)
buf = p;
return buf;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 03-02-2007 alle 10:50. |
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
grazie andbin!!
l'unica parte che non capisco bene è questa però: (strchr restituisce un puntatore al carattere '\n' in questo caso? e nel caso lo trova (!= NULL) inserisce il carattere di terminazione stringa '\0' ? lo interpreto cosi...) Codice:
if ((p = strchr (&buf[len], '\n')) != NULL)
*p = '\0';
__________________
ka0s |
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Codice:
char *s;
printf ("Inserisci una stringa: ");
s = read_line_string (stdin);
if (s != NULL)
{
/* ...fai quello che vuoi ... */
free (s);
}
fgets (&buf[len], block, f); ho messo: fgets (&buf[len], capacity-len, f); Come era prima non era sbagliato, solo non sfruttavo completamente la capacità del buffer nei cicli successivi.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
wow grazie!! ora funziona!!
scusa, ti chiedo un altro chiarimento (con le stringhe proprio è un casino per me!): il programma che sto facendo prende N coppie di stringhe (quindi ho messo il codice all'interno di un ciclo, ed ho tolto la funzione free) e ad ogni iterazione del ciclo passa le due stringhe ad una funzione che deve salvarle in un campo di una struttura (ad esempio il campo "nome") se non sono già state memorizzate prima... praticamente uso una linked list nella quale ogni nodo è una struct di un certo tipo, dopo l'inserimento di ogni coppia di stringhe il programma controlla se per ogni nodo->nome corrisponde una delle due stringhe passate, e nel caso non trovi valori uguali deve creare un altro nodo con il nome della stringa in questione. Il fatto è che anche se inserisco stringhe tutte uguali me le prende tutte come fossero diverse... per cui ho due dubbi: 1. come confronto due stringhe passate come argomento ad una funzione? (io usavo '==' ma a questo punto credo che non vada bene) 2. c'è qualche problema nel memorizzare la stringa, ottenuta con la funzione che mi hai scritto tu, in una struttura? (come definisco dentro la struttura il campo nome?) scusa ma veramente sono bloccato con questi problemi "stupidi"...
__________________
ka0s |
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Per confrontare il contenuto di 2 stringhe devi usare la funzione strcmp (o strncmp per un confronto al massimo di 'n' caratteri). Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
grazie veramente!! ora ho risolto!!
__________________
ka0s |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:09.



















