表达式:(无符号)(c + 1)< = 256

时间:2011-11-21 23:30:57

标签: c++ visual-c++

我正在制作一个哈希程序,它计算文本文件中每个单词实例的数量。这是我的计数功能:我在尝试运行时遇到错误。

  

56表达式:(无符号)(c + 1)< = 256

当它正在读取文本文件中的第一个非alpha垃圾字符时,它似乎在isalpha函数上崩溃。

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;
        }
    }
}
}

1 个答案:

答案 0 :(得分:5)

我认为isalpha失败了。最有可能(unsigned)(c + 1) <= 256是被断言的表达式。看起来这个断言试图确保c的值落在[0,255]之内。

假设chsigned char,并且您尝试将值128存储在其中,然后将其传递给isalpha,则断言的左侧将评估为非常大的数字,导致它失败。

128无法存储在signed char中,因此ch的值实际上变为-128,这是无符号128(二进制为1000 0000)的有符号表示形式。 isalphach作为int(c + 1)实际上是(-128 + 1),后者变为-127。然后将此值转换为无符号整数,该整数变为非常大的值。

解决方案是将代码中的ch更改为unsigned char,如果它的值可能大于127。