Newsgroup: it.comp.lang.c
Titolo: chiarimento strutture

salve a tutti
Stafo facendo un programma per esercitarmi sui puntatori a strutture,pero'
non riesco, quindi ho deciso di seguire piu' o meno l'esempio che sta sul
libro (kernighan).
Alla fine ho copiato quell'esempio(ho controllato casomai avessisbagliato
qualcosa nella copiatura di )pero', quando eseguo digito dei caratteri(che
non vedo) , premo invio mi da un access violation.......
vi riporto il codice
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <ctype.h>
#define MAXWORD 100
#define NKEYS (sizeof keytab/sizeof keytab[0])
struct key {
   char *word;
   int count;
};keytab[]= {
   "auto", 0,
   "break", 0,
   "case", 0,
   "char", 0,
   "const", 0,
   "continue", 0,
   "default", 0,
   /*....*/
   "unsigned", 0,
   "void", 0,
   "volatile", 0,
   "while", 0
};
int getword(char*,int);
struct key *binsearch(char *,struct key *,int);
int main(void)
{
   char word[MAXWORD];
   struct key *p;
   while(getword(word,MAXWORD)!=EOF)
      if(isalpha(word[0]))
        if((p=binsearch(word,keytab,NKEYS))!=NULL)
          p->count++;
   for(p=keytab;p<keytab+NKEYS;p++)
     if(p->count>0)
         printf("%4d %s\n",p->count,p->word);
   return 0;
}
struct key *binsearch(char *word,struct key *tab,int n)
{
   int cond;
   struct key *low=&tab[0];
   struct key *high=&tab[n];
   struct key *mid;
   while(low<high)
   {
      mid=low+(high-low)/2;
      if((cond=strcmp(word,mid->word))<0)
        high=mid;
      else if(cond>0)
        low=mid+1;
        else
          return mid;
   }
   return NULL;
}
int getword(char *word,int lim)
{
   int c,getch(void);
   void ungetch(int);
   char *w=word;
   while(isspace(c=getch()))
      ;
   if(c!=EOF)
     *w++=c;
   if(!isalpha(c))
   {
     *w='\0';
     return c;
   }
   for(;--lim>0;w++)
      if(!isalnum(*w=getch()))
      {
        ungetch(*w);
        break;
      }
      *w='\0';
      return word[0];
}
grazie a tutti Ciao

 };keytab[]= {
Mi sembra un po strano (diciamo pure sbagliato) quel punto e virgola
prima di keytab....
ciao,
g.

si hai ragione il" ;" non ci vuole.
comunque il programma non funziona ugualmente, cioč mi apre la console pero'
non  mi permette di scrivere niente non succede niente neanche se dň
l'EOF(ctrl+d).
grazie e ciao

 }
Per il resto mi pare ok.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"La mia teoria scientifica preferita e` quella secondo la quale gli 
 anelli di Saturno sarebbero interamente composti dai bagagli andati 
 persi nei viaggi aerei." -- Mark Russel

Ciao grazie per la risposta comunque continuo ad avere il solito problema
cioe' un access violation.E non so proprio come risolverlo;
grazie  ciao
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <ctype.h>
#define MAXWORD 100
#define NKEYS (sizeof keytab/sizeof keytab[0])
struct key {
   char *word;
   int count;
};keytab[]= {
   {"auto", 0},
   { "break", 0}, Ho provato ad usare le parentesi    { "case", 0},
purtroppo il compilatore mi da un
   { "char", 0},   errore di excepted e altri.
   {"const", 0},
   { "continue", 0},
   { "default", 0},
   { "unsigned",0},
   { "void", 0},
   { "volatile",0},
   { "while", 0},
};

int main(void)
{





int getword(char *word,int lim)
{
   int c;
   char *w=word;
   do {
      c=getchar();
   }while(isspace(c))
      ;
   if(c!=EOF)
     *w++=c;
   if(!isalpha(c))
   {
     *w='\0';
     return c;
   }
   for(;--lim>0;w++)
      if(!isalnum(*w=getchar()))
      {


   struct key *high=&tab[n];
L'unico passo  critico e` questo.  high punta  un elemento dopo  la fine
dell'array,  ma e`  perfettamente lecito  visto che  high non  viene mai
dereferenziato...
Che compilatore usi?
Con quale input riesci a riprodurre l'access violation?
Quando avviene l'access violation (all'avvio? dopo un certo numero di
righe? solo con una certa sequenza?)
Riesci a fare il debug passo passo del programma?
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La vispa candela bruciava l'erbetta
creando un'essenza alquanto sospetta;
sembrava l'odore di una sacrestia
ma presto mi accorsi che era maria.