C - l'extraction de mots à partir de la chaîne
Je suis assez nouveau dans C et donc de rencontrer un peu de confusion avec l'aide de pointeurs.
Je suis d'essayer d'extraire des mots à partir d'une chaîne de caractères ASCII.
Par exemple, si j'ai la chaîne @@Bonjour..monde>>, je veux obtenir les mots "Bonjour" et "monde" de la chaîne et de les ajouter à ma liste liée.
Un mot est défini comme une séquence de lettres, et chaque mot est à plus de 64 octets. Aussi, le caractère et la fonction isspace() renvoie une valeur non nulle est considérée comme un espace.
En gros, je suis la numérisation dans les chaînes de caractères à partir d'un fichier à l'aide de fscanf, ensuite, pour chaque chaîne de l'appel de ma fonction read_words(char *s) pour obtenir les mots appropriés de la chaîne et de les ajouter à ma liste liée pour une utilisation ultérieure.
Voici mon code qui semble être de lancer une erreur qui a à voir avec un pointeur.
struct node {
char *val;
struct node *next;
int count;
} *words = NULL;
void read_words(char *s)
{
struct node *tmp;
char word[64+1];
int i, check, wordStarted = 0, count = 0;
for (i = 0; s[i] != 'struct node {
char *val;
struct node *next;
int count;
} *words = NULL;
void read_words(char *s)
{
struct node *tmp;
char word[64+1];
int i, check, wordStarted = 0, count = 0;
for (i = 0; s[i] != '\0'; i++)
{
if ((isspace(s[i]) != 0) || !isalpha(s[i]))
{
if (wordStarted == 1)
{
check = check_list(word);
if (check != 1) {
word[count] = '\0';
tmp = malloc(sizeof(struct node));
tmp->val = word;
tmp->count = 1;
tmp->next = words;
words = tmp;
}
count = 0;
wordStarted = 0;
}
}
else
{
word[count++] = s[i];
wordStarted = 1;
}
}
}
'; i++)
{
if ((isspace(s[i]) != 0) || !isalpha(s[i]))
{
if (wordStarted == 1)
{
check = check_list(word);
if (check != 1) {
word[count] = 'struct node {
char *val;
struct node *next;
int count;
} *words = NULL;
void read_words(char *s)
{
struct node *tmp;
char word[64+1];
int i, check, wordStarted = 0, count = 0;
for (i = 0; s[i] != '\0'; i++)
{
if ((isspace(s[i]) != 0) || !isalpha(s[i]))
{
if (wordStarted == 1)
{
check = check_list(word);
if (check != 1) {
word[count] = '\0';
tmp = malloc(sizeof(struct node));
tmp->val = word;
tmp->count = 1;
tmp->next = words;
words = tmp;
}
count = 0;
wordStarted = 0;
}
}
else
{
word[count++] = s[i];
wordStarted = 1;
}
}
}
';
tmp = malloc(sizeof(struct node));
tmp->val = word;
tmp->count = 1;
tmp->next = words;
words = tmp;
}
count = 0;
wordStarted = 0;
}
}
else
{
word[count++] = s[i];
wordStarted = 1;
}
}
}
Toute aide avec ce serait bien apprécié!
Merci!
- Essayez
strtok
. Il divise une chaîne en pièces fondée sur un certain nombre de fractionnement des personnages. - Avez-vous essayé de debug de votre code?
- merci de poster votre check_list() de la mise en œuvre
- Aussi, vous pouvez juste dire
if(isspace(s[i]))
au lieu deif(isspace(s[i]) != 0)
. Rien à votre problème, juste l'écriture nettoyeur de code 😉 - vous savez que votre algorithme est d'écraser les
tmp->val
chaque itération suivante de droite? Utilisationstrtok
, malloc tmp->val, et strcpy le jeton.
Vous devez vous connecter pour publier un commentaire.
Vous aurez envie de marquer la chaîne, au lieu de la mise en œuvre de votre propre algorithme et ajouter les pièces à votre liste liée. Utilisation
strtok
(ref).À partir du lien ci-dessus.. exemple:
De sortie:
Meilleure solution pour La norme ANSI C.
Utilisation strtok() il n'est pas toujours bonne:
Essayer la prochaine et lire les commentaires pour plus de détails:
Compiler et voir le résultat: