RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 551664
Accepted
beginner
beginner
Asked:2020-08-04 01:58:59 +0000 UTC2020-08-04 01:58:59 +0000 UTC 2020-08-04 01:58:59 +0000 UTC

这个错误是什么意思?Runtime Library

  • 772

我正在编写一个程序,用于计算二进制文件中的字符数。它计算字符数,显示它们,但是在计算之后,程序没有完成,而是弹出了这样的异常。

在此处输入图像描述

它不指向我的代码,它指向文件 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;
        }
    }
}
c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Harry
    2020-08-04T13:09:52Z2020-08-04T13:09:52Z

    我们不会触及算法本身 - 如我们所见,它不起作用。但它不起作用,特别是因为您至少可以访问数组外部 - 使用x >= n. 而这在理论上会导致未定义的行为。

    错误的意思是一些函数is...- 显然isalnum- 已经传递了一个超出范围的值char并且EOF- 你知道这些函数的参数是int?

    这究竟发生在哪里以及如何发生 - 查看最小可重现代码的存在是有意义的。

    现在,请熟悉该算法。作为一个选项 - 这个,更简单 :) 不是最好的选择,但只是为了减少你的代码编辑,我留下了硬连线文件和通读fread,一般来说,你有什么地方可以转身:)同样的检查“字母数字”(至少为了输出的美观,例如,如果有任何换行符)自己插入。

    void calculate_symb()
    {
        FILE * fd = fopen("test.dat","rb");
        if (!fd)
            printf("Ошибка!Файл не найден!\n");
        else
        {
            int symv[256] = { 0 };
            int fsize = 0;
            cout<<"Вывод содержимого двоичного файла:"<<endl;
            char symbol;
            while(fread(&symbol, sizeof(char), 1, fd))
            {
                fsize++;
                cout << symbol;
                symv[symbol]++;
            }
            fclose(fd);
            cout<<"Количество символов в файле = "<<fsize<<endl;
    
            cout<<"Повторяющиеся символы"<<endl;
            for(int x = 0; x<=255; x++)
            {
                if (symv[x]) cout << "\"" << (char)x << "\" -> " << symv[x] << endl;
            }
        }
    }
    
    • 1
  2. beginner
    2020-08-04T21:03:03Z2020-08-04T21:03:03Z

    问题是这样解决的

    1) 首先,我为我的行添加了空终止符 '\0'。

    2) 另外,l 变量中的逐步调试程序将 kryakozyabra 符号添加到该行,因此他对异常进行了诅咒,因为他不明白是什么符号,无法在 255 个名称中简单地找到它。

    3) 是的,他错误地计算了字母的数量,这个问题也通过在循环中添加一个变量 l 来解决,它使用 strlen 从字符串中读取字符数。

    更正的代码片段(循环前)

    char* symv = new char[n];
        symv[n+1]='\0';
        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;
        int l=strlen(symv);
    
        cout<<"Повторяющиеся символы:"<<endl;
        for(int x = 0; x<l-1; x++)
    

    结果,一切正常,无一例外。

    在此处输入图像描述

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5