Printf и cout только печать первого символа args cpp

Возможно, я здесь полностью упускаю суть, но у меня есть следующий метод для распечатки аргументов в программе cpp в visual studio:

int _tmain(int argc, char* argv[])
{

char* fu = "Bar";

std::cout << "Test, " << argc << ", " << argv[0] << ", " << argv[1] << ", " << fu << endl;
printf("%s, %s, %s", argv[0], argv[1], fu);
return 0;
}

Проблема, с которой я сталкиваюсь, заключается в том, что кажется, что печатается только первый символ аргументов, а не вся строка.

Из того, что я могу сказать, argv [0] разыменовывает массив argv, чтобы получить char *, и это то, что я передаю в функции cout / printf. Затем они должны напечатать все символы до символа \ 0.

Я создал тестовый char * fu, чтобы увидеть, была ли проблема с передачей char * в функции, но ‘Bar’ был успешно напечатан.

Единственное, о чем я могу подумать, это то, что размер fu известен во время компиляции, а размер argv — это не смешно с тем, как он компилируется.

Я знаю, что могу распечатать содержимое, просматривая символы, но это, кажется, лишает смысла, например, что делать, если я хочу работать со строками для сравнения или чего-то еще. Может кто-нибудь объяснить, пожалуйста, что происходит?

-1

Решение

Либо изменить _tmain в mainили изменить char в TCHAR а также printf в _tprintf, Вы должны использовать TCHARна постоянной основе или нет.

Ясно, что вы создаете сборку Unicode, и параметры, переданные вам wchar_t* указатели, а не char*, Обращаясь с ними, как будто они char*ваша программа демонстрирует неопределенное поведение.

1

Другие решения

Проблема в том, что вы используете, вероятно, набор символов Uni-Code. поэтому предполагается, что он составляет 16 бит (широкий символ) на символ. Но ваши анализируемые символы имеют только 8 битов, поэтому вы помещаете младшие 8 битов в область 16 битов. И вы выпустили остальные 8 битов бесплатно. Таким образом, внутри вашего приложения вы рассматриваете его как неширокий массив символов и читаете его Байт за байт, поэтому вы получаете первые 8 битов, а второй раз вы читаете из неинициализированного блока, который, вероятно, всего 0000 0000 (что в вашем случае установит токен ‘\ 0’), но это может быть что угодно, так как вы ничего не добавили.

Лучший способ решения этой проблемы (поскольку вы не ожидали использовать широкие символы), просто перейдите в свойства своего проекта MSVC и выберите в разделе «Общие сведения-> Набор символов» «использовать многобайтовый набор символов» вместо «использовать юникод». ,
Тогда вам просто нужно переименовать главное в «основное», и оно должно работать в рамках вашего вопроса.

1