c++ - 56 表达式 : (unsigned)(c + 1) <= 256

标签 c++ visual-c++

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

56 Expression: (unsigned)(c + 1) <= 256

当它读取文本文件中的第一个非字母垃圾字符时,它似乎在 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;
        }
    }
}
}

最佳答案

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

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

128 不能存储在 signed char 中, 所以 ch 的值实际上变为-128,这是无符号128(二进制为1000 0000)的有符号表示。 isalpha正在服用 ch作为int , 所以 (c + 1)实际上是 (-128 + 1) ,变成 -127。然后将该值转换为一个无符号整数,变成一个非常大的值。

一个解决方案是改变ch在你的代码中为 unsigned char ,如果它的值有可能大于 127。

关于c++ - 56 表达式 : (unsigned)(c + 1) <= 256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8220041/

相关文章:

c++ - 不允许您使用::解析枚举的错误名称是什么?

c++ - 当 T 具有非平凡的析构函数时,类类型 T 的对象可以进行常量初始化吗?

visual-c++ - 如何在 mfc 中更改静态文本控件的背景颜色(当按下按钮或在计时器中时)?

c++ - 无法使用 CMemFile::Detach() 复制 CMemFile 中存在的数据

c++ - OpenCV drawMatches 错误

c++ - R 值似乎无法为未命名的临时对象提供不完整的支持,或者我在这里遗漏了什么?

c++ - 能否在 MFC 按钮控件上检测到鼠标右键单击事件?

visual-c++ - DLL 的 "image version"有何用途(使用/VERSION Visual C++ 链接器开关设置)?

c++ - 使用链表的 RNB 计算器

c++ - 对初始化时使用的未初始化局部变量感到困惑?