Ciao ragazzi!
Sono alle prese con un programma che tenta di contare quante volte si digitano le parole chiave del C. Tuttavia, ho parecchi problemi, e la versione presentata sul mio libro sembra errata, in quanto conta solo la prima parola (se volete dare un'occhiata al programma originale e smentirmi ecco qui il link.
In particolare, quindi, ho problemi con la funzione getword()
codice:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_CHARS 100
#define MAX_WORDS 1000
#define MAX_KEYS (sizeof (keytab) / sizeof (keytab[0]) )
//Ogni struttura di tipo key è caratterizzata dalla parola e dal numero di occorrenze
struct key
{
char *word;
int count;
};
//Inizializzo un vettore contenente strutture di tipo key con tutte (si fa per dire :) )
//le parole chiave del C
struct key keytab[] =
{
{"auto", 0},
{"else", 0},
// svariate altre parole chiave
{"while", 0},
};
static int getch (void); //simile a getc(void)
static void ungetch (int); //simile a ungetc(int)
struct key *binsearch(char *, struct key *, int);//effettua una ricerca della parola nel vettore
//di strutture. Restituisce il puntatore alla struttura contenente la parola o NULL.
int getword(char *, int); //legge la parola successiva in ingresso, dove per parola si
//intende una stringa che cominci con un carattere alfanumerico. Restituisce la lunghezza
//della parola o -1
int main()
{
char word[MAX_CHARS];
struct key *p;
while (getword(word, MAX_CHARS) > 0)
if ( (p = binsearch(word, keytab, MAX_WORDS)) != NULL)
p->count++;
for (p = keytab; p < keytab + MAX_KEYS; p++)
if (p->count > 0)
printf("Word: %s appears %d times\n", p->word, p->count);
return 0;
}
int
getword(char *word, int limit)
{
int c, i;
while ( (c = getchar()) != EOF && !isalnum(c))
; //avanza finchè non trova un carattere alfanumerico
if (c == EOF) //se abbiamo il segnale di fine file, lo restituiamo
return -1;
word[0] = c;
for (i = 1; i < limit && (c = getchar()) != EOF && c != '\n' && isalnum(c); i++)
word[i] = c;
ungetch(c);
word[i] = '\0';
return i;
}
//Ho omesso le altre funzioni per questioni di lunghezza e perchè penso siano scritte bene
Quando compilo il codice non ho errori, ma quando lo eseguo, dopo l'inserimento di una qualsiasi parola, il programma si blocca dicendomi "Errore di segmentazione".
Grazie mille a tutti coloro che vorranno darmi una mano