使用转义序列时,是什么导致 printf() 向控制台输出奇怪的字符?

问题描述 投票:0回答:1

我正在编写一个简单的函数,用于我的实用程序实现文件之一。我最近发现,在使用 C++17 库之一时,在调用

std::filesystem::path::string()
时使用
printf()
函数输出目录条目只会导致一串奇怪的字符被发送到
STDOUT
。使用
cout
不会产生任何问题。这是代码:

    if( !initialized )
    {
        try
        {
            const filesystem::path MODELS_DIRECTORY = R"(C:\-----\-----\-----\models)";
            const filesystem::path RESOURCES_DIRECTORY = filesystem::relative(R"(\Resources)", MODELS_DIRECTORY);

            for( const filesystem::directory_entry& dir_entry : filesystem::directory_iterator{ MODELS_DIRECTORY } )
            {
                string test = "this\\is\\a test\\";
                string directory = dir_entry.path().string();
                printf("%s\n", test);
                //cout << directory << endl;
            }
        }
        catch( filesystem::filesystem_error& fs_err )
        {
            printf( "fs exception caught in GraphicsDataCatalog::InitCatalog()" );
        }
        initialized = true;
    }

使用由

std::string test
组成的测试机制和对
printf()
的调用表明双反斜杠是罪魁祸首。删除字符串中的空格并不能解决问题——我假设可能有一个格式说明符来解决打印到控制台的不稳定字符。将
cout
string
调用返回的
dir_entry.path().string()
一起使用会成功。

有人对此主题有更多了解吗?

MRE(最小可重复示例):

#include <iostream>

using namespace std;

int main()
{
    const string PASS_STRING = "This is a test.";
    const string FAIL_STRING = "This\\is not\\a\\test.";

    cout << PASS_STRING << endl;
    cout << "Test passed.\n" << endl;

    printf( "%s\n", FAIL_STRING );
    printf( "Test failed.\n" );

    return 0;
}
c c++17 output
1个回答
0
投票

%s
格式说明符采用
char *
,而不是
std::string
。您将错误的参数类型传递给
printf

© www.soinside.com 2019 - 2024. All rights reserved.