c++ - 为什么 _ftscanf_s 会抛出异常而 _ftscanf 不会?

标签 c++ c windows exception unicode

我有以下输入文件:

1 100000 hajs ssaa 25
2 150000 sdsd Assso 22
...

以及以下程序:

#define _UNICODE
#define UNICODE

#define _CRT_SECURE_NO_WARNINGS

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>


#define MAX_CHARS       30

typedef struct student
{
    WORD identifier;
    DWORD registerNumber;
    TCHAR surname[MAX_CHARS + 1];
    TCHAR name[MAX_CHARS + 1];
    WORD mark;

} student_t, *student_ptr;


int _tmain(DWORD argc, LPTSTR argv[])
{
    FILE* fileIn;
    errno_t error;
    student_t student;

#ifdef UNICODE
    error = _wfopen_s(&fileIn, argv[1], L"r");
#else
    error = fopen_s(&fileIn, argv[1], "r");
#endif

    if (error)
    {
        _ftprintf(stderr, _T("Unable to open %s\n"), argv[1]);
        exit(EXIT_FAILURE);
    }

    while (_ftscanf_s(fileIn, _T("%hu %lu %s %s %hu"), &student.identifier, &student.registerNumber, 
        student.surname, student.name, &student.mark) != EOF)
    {

    }

    fclose(fileIn);

    return 0;
}

现在,如果我使用 _ftscanf_s,我会遇到以下异常:

First-chance exception at 0x53871CA4 (msvcr110d.dll) in vsproj.exe: 0xC0000005: Access violation writing location 0x002F0000.

如果我使用 _ftscanf(不安全版本),程序运行时不会出现错误。为什么?

最佳答案

您必须指定 %s 所需的长度参数。请尝试使用 _countof宏观:

while (_ftscanf_s(fileIn, _T("%hu %lu %s %s %hu"), &student.identifier, &student.registerNumber, 
        student.surname, _countof(student.surname), student.name, _countof(student.name), &student.mark) != EOF)
{
}

关于c++ - 为什么 _ftscanf_s 会抛出异常而 _ftscanf 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23482913/

相关文章:

C++ 自定义调用约定

c - 将服务器套接字绑定(bind)到端口失败 (C)

c - 在结构数组内分配指针

java - 使用 Powershell 时出现 JDWP 语法错误

C++ - Windows IoT Core 远程调试器 - 调试器无法启动

c++ - 使用 C++ 的 Palindrome 程序的意外输出

c++ - 确保从 Fortran 应用程序调用 C++ 析构函数

c++ - 关于 enable_shared_from_this 的问题

抛硬币程序问题,C 编程

java - 阻止应用程序的所有其他输入并通过 Java 包装器对其进行控制