2010-01-03 2 views
1

"Comme écrit, getint traite un + ou - non suivi d'un chiffre comme une représentation valide de zéro.Réinstallez-le pour repousser un tel caractère sur l'entrée."getint et getch

Ok, c'est la version originale:

int getint2(int *pn) 
{ 
    int c, sign; 

    while(isspace(c=getch())) 
     ; 

    if(!isdigit(c) && c!= EOF && c!= '+' && c!= '-') { 
      ungetch(c); 
      return 0; 
    } 

    sign = (c == '-') ? -1 : 1; 

    if(c == '+' || c == '-') { 
     c = getch(); 
    } 

    for(*pn = 0; isdigit(c); c = getch()) 
     *pn = 10 * *pn + (c - '0'); 

    *pn *= sign; 
    ungetch(c); 
    return c; 
} 

Et j'édité cette façon:

int getint2(int *pn) 
{ 
    int c, sign; 

    while(isspace(c=getch())) 
     ; 

    if(!isdigit(c) && c!= EOF && c!= '+' && c!= '-') { 
      ungetch(c); 
      return 0; 
    } 

    sign = (c == '-') ? -1 : 1; 

    if(c == '+' || c == '-') { 
     c = getch(); 

     if(!isdigit(c)) { 
     ungetch(c); 
     return 0; 
     } 
    } 

    for(*pn = 0; isdigit(c); c = getch()) 
     *pn = 10 * *pn + (c - '0'); 

    *pn *= sign; 
    ungetch(c); 
    return c; 
} 

Alors je ne suis pas sûr de ce que fait l'auteur veut. Dois-je désengager le +/- aussi bien, ou juste le caractère après? Dois-je retourner 0 au cas où il n'y aurait pas de chiffres après +/- ou -1?

J'ai aussi une question sur les fonctions getch et ungetch: depuis EOF sur mon Sistem est -1, voici comment je l'ai écrit getch et ungetch:

int buf = EOF; 

int getch() 
{ 
    int temp; 

    if(buf == -2) 
     return EOF; 

    if(buf == EOF) 
     temp = getchar(); 
    else 
    { 
     temp = buf; 
     buf = EOF; 
    } 

    return temp; 
} 

void ungetch(int c) 
{ 
    if(c == EOF) 
     buf = -2; 

    buf = c; 
} 

Alors on m'a dit par certaines personnes qui EOF peut être -2. Que dois-je faire pour éviter ce genre de «problème».

+1

Juste pour que nous le savons, est-ce un problème de travail? Si oui, vous l'avez demandé de la bonne façon, en publiant le travail que vous avez déjà fait et en posant des questions précises, mais il est bon de mentionner que ce sont des devoirs afin que les gens puissent garder cela à l'esprit. –

+0

Si vous ne fournissez qu'un seul caractère de tampon de "remise", vous pouvez aussi utiliser 'getchar' et' ungetc' directement au lieu de lancer votre propre paire 'getch' /' ungetch'. Je pense que vos changements auront besoin de plus d'un caractère de "non-get" cependant, votre implémentation peut fournir cela. –

+0

Non, c'est un exercice de K & R, mais je suppose que je le dis à partir de maintenant. – Tool

Répondre

1

Pour répondre à votre deuxième question, à propos de EOF et -2, je peux penser à deux solutions:

  • vous pourriez avoir un tableau de caractères dans le « index » « tampon », et un dans le position (c.-à-d., avoir une pile rudimentaire). Je crois que les tableaux sont introduits dans K & R par ce point. Cela vous donnera plus de flexibilité dans le fait que vous pouvez avoir plus d'un caractère. Un avantage supplémentaire de ce système est que votre code dans la partie 1, où vous pourriez avoir besoin de deux fois plus, devient également plus facile.
  • vous pouvez stocker le «état» dans une autre variable int, tels que int buffered = 0;, puis getch() retournera buf uniquement lorsque buffered == 1. ungetch() ensembles buffered = 1, getch() ensembles buffered = 0:
static int buf; 
static int buffered = 0; 

int getch() 
{ 
    if (buffered) { 
     buffered = 0; 
     return buf; 
    } 
    return getchar(); 
} 

void ungetch(int c) 
{ 
    buffered = 1; 
    buf = c; 
}
Questions connexes