Вывод искаженных символов при использовании cout API - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь запустить этот простой код в VS 2015

#include "stdafx.h"
# include <iostream>

int main()
{
    char * szOldPath = "\"C:\icm\scripts\StartupSync\runall.bat\" nonprod"; 
    std::cout << szOldPath << std::endl;

    return 0;
}

Однако вывод szOldPath неверен и консоль печатает -

unall.bat" nonprodupSync

Я подозреваю это может быть из-за Unicode, и я должен использовать wcout. Поэтому я отключил Юникод, выбрав «Свойства конфигурации» -> «Основные» -> «Набор символов», и попытался установить для него значение «Не установлено» или «Многобайтовый». Но все еще сталкиваюсь с этой проблемой.

Я понимаю, что отключать UNICODE нехорошо, но я пытаюсь понять некоторый устаревший код, написанный в нашей компании, и этот эксперимент является частью этого упражнения. можно заставить команду cout успешно распечатать szOldPath?

1 Ответ

1 голос
/ 22 апреля 2020

Ваша проблема не имеет ничего общего с Unicode.

\r - это escape-последовательность для возврата каретки. Итак, вы распечатываете "C:\icm\scripts\StartupSync, а затем \r говорит терминалу переместить курсор назад к началу текущей строки, а затем печатается unall.bat" nonprod, перезаписывая то, что уже было.

Вам нужно экранировать все символы \ в строковом литерале, точно так же, как вам нужно экранировать символы ".

Кроме того, ваша переменная должна быть объявлена ​​как указатель на const char при назначении строкового литерала указателю. Это применяется в C ++ 11 и более поздних версиях:

#include "stdafx.h"
#include <iostream>

int main()
{
    const char * szOldPath = "\"C:\\icm\\scripts\\StartupSync\\runall.bat\" nonprod"; 
    std::cout << szOldPath << std::endl;

    return 0;
}

Кроме того, в C ++ 11 и более поздних версиях вы можете использовать необработанный строковый литерал вместо того, чтобы избежать необходимости экранирования. символы с ведущими \:

const char * szOldPath = R"("C:\icm\scripts\StartupSync\runall.bat" nonprod)"; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...