56 Ausdruck: (vorzeichenlos) (c + 1) <= 256

  • Ich mache ein Hash-Programm, das die Anzahl der einzelnen Instanzen eines Wortes in einer Textdatei zählt. Dies ist meine Zählfunktion: Beim Versuch, sie auszuführen, wird eine Fehlermeldung angezeigt.

    56 Ausdruck: (unsigniert) (c + 1) & lt; = 256

    Es scheint, als stürzte die isalpha-Funktion ab, wenn sie die allerersten Nichtalpha-Zeichen in der Textdatei liest. p>

     int
    count(ifstream & fs,int size)
    {
    int find(const char *,int, int);
    
    int f,i,l,y;
    char ch,*p,s[maxs+1];
    
    for(y = l = i = 0; i < size; i++)
    {
        table[i].k = 0;
        table[i].p = nill;
    }
    
    p = s;
    
    while(fs.get(ch))
    {
        if(isalpha(ch))
        {
            if(l < maxs)
            {
                l++;
                *p++ = (char)(ch | 0x20);
            }
        }
        else
        {
            if(l)
            {
                *p = '\0';
    
                if(f = find(s,size,l) < 0)
                {
                    return(f);
                }
                y += f;
                p = s;
                l = 0;
            }
        }
    }
    }
     
    22 November 2011
    Mateen UlhaqOskar Walker
1 answer
  • Mir scheint, dass isalpha eine Behauptung versagt. Am wahrscheinlichsten (unsigned)(c + 1) <= 256 ist der geltend gemachte Ausdruck. Anscheinend versucht diese Behauptung sicherzustellen, dass der Wert von c innerhalb von [0, 255] liegt.

    Angenommen, ch ist ein signed char und Sie versuchen zu speichern Wenn Sie den Wert 128 eingeben, übergeben Sie ihn an isalpha. Die linke Seite der Assertion wird mit einer sehr großen Zahl bewertet, was dazu führt, dass sie versagt.

    128 kann nicht in einem signed char gespeichert werden, so dass der Wert von ch tatsächlich -128 wird, was die vorzeichenbehaftete Darstellung von 128 ist (1000 0000 im Binärformat) ). isalpha nimmt ch als int an, also (c + 1) ist tatsächlich (-128 + 1), was zu -127 wird. Dieser Wert wird dann in eine vorzeichenlose Ganzzahl umgewandelt, die zu einem sehr großen Wert wird.

    Eine Lösung besteht darin, ch in Ihrem Code in unsigned char zu ändern, falls dies der Fall ist Möglicherweise kann sein Wert größer als 127 sein.

    22 November 2011
    Collin Dauphinee