我正在编写一个程序,用于计算二进制文件中的字符数。它计算字符数,显示它们,但是在计算之后,程序没有完成,而是弹出了这样的异常。
它不指向我的代码,它指向文件 istype.c 我进去看了看第 68 行
_ASSERTE(c >= -1 && c <= 255);
我相信我错过了某种编码,因为如果我的代码被诅咒,那么一切都会指向它。
调试器正确显示了所有需要的值。
部分代码(此处显示重复字符数)
void calculate_symb(FILE* fd)
{
int max = 0;
fd = fopen("test.dat", "rb");
if (!fd)
printf("Ошибка!Файл не найден!\n");
else
{
fseek(fd, 0L, SEEK_END);
long fsize = ftell(fd);
int n = fsize;
cout << "Количество символов в файле = " << fsize << endl;
char* symv = new char[n];
fseek(fd, 0L, SEEK_SET);
cout << "Вывод содержимого двоичного файла:" << endl;
for (int i = 0; i < n; i++)
{
fread(symv, sizeof(char), n, fd);
cout << symv[i];
}
fclose(fd);
cout << endl;
cout << "Повторяющиеся символы" << endl;
for (int x = 0; x < 255; x++)
{
bool flag = true;
if (isalnum(symv[x]))
for (int y = x - 1; y >= 0 && flag; y--)
if (symv[x] == symv[y])
flag = false;
if (flag && isalnum(symv[x]))
cout << "\"" << symv[x] << "\"" << " -> " << count(symv, symv + 255,
symv[x]) << endl;
}
}
}

我们不会触及算法本身 - 如我们所见,它不起作用。但它不起作用,特别是因为您至少可以访问数组外部 - 使用
x >= n. 而这在理论上会导致未定义的行为。错误的意思是一些函数
is...- 显然isalnum- 已经传递了一个超出范围的值char并且EOF- 你知道这些函数的参数是int?这究竟发生在哪里以及如何发生 - 查看最小可重现代码的存在是有意义的。
现在,请熟悉该算法。作为一个选项 - 这个,更简单 :) 不是最好的选择,但只是为了减少你的代码编辑,我留下了硬连线文件和通读
fread,一般来说,你有什么地方可以转身:)同样的检查“字母数字”(至少为了输出的美观,例如,如果有任何换行符)自己插入。问题是这样解决的
1) 首先,我为我的行添加了空终止符 '\0'。
2) 另外,l 变量中的逐步调试程序将 kryakozyabra 符号添加到该行,因此他对异常进行了诅咒,因为他不明白是什么符号,无法在 255 个名称中简单地找到它。
3) 是的,他错误地计算了字母的数量,这个问题也通过在循环中添加一个变量 l 来解决,它使用 strlen 从字符串中读取字符数。
更正的代码片段(循环前)
结果,一切正常,无一例外。