Невозможно распечатать значения argv[], используя std::cout в VC++

Это мой первый вопрос на сайте, хотя я уже давно прихожу сюда для ознакомления. Я понимаю, что argv[0] хранит имя программы, а остальные аргументы командной строки хранятся в оставшихся слотах argv[k]. Я также понимаю, что std::cout обрабатывает символьный указатель как завершенную нулем строку и печатает строку. Ниже моя программа.

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

using namespace std;

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

    cout << argv[0] << " ";
    cout << argv[1] ;

    return 0;
}

Согласно всем другим программам, которые я видел по поиску в Интернете в этом выпуске, эта программа должна распечатать две строки, а именно. название программы и аргумент командной строки. В окне консоли отображается

0010418c 001048d6

Я считаю, что это указатели на argv[0] и argv[1] соответственно. Единственный аргумент командной строки, который у меня есть, это "nanddumpgood.bin", который идет в argv[1] и правильно показывает строки, если во время отладки я наведите курсор мыши на массивы argv[].

Что это происходит? Что я делаю неправильно? Я так понимаю, массивы распадаются на указатели в особых случаях? Это тот случай, когда это не так?

3 ответа

Решение

Я тоже понимаю что std::cout обрабатывает указатель на символ как строку с нулевым символом в конце и выводит строку.

Это в основном правильно. Это работает для char*, но не другие типы персонажей. Что именно проблема. У тебя есть _TCHAR*, который char* в сборке ANSI, но не в сборке Unicode, поэтому вместо получения специального поведения строки вы получаете поведение указателя по умолчанию.

Я так понимаю, массивы распадаются на указатели в особых случаях? Это тот случай, когда это не так?

argv это массив, но ни argv[0] ни argv[1] являются массивами, они оба указатели. Распад не является фактором здесь.

Самое простое решение - использовать int main(int argc, char* argv[]) так что вы получите не-Unicode строки для аргументов командной строки. Я рекомендую это, а не переходить на wcoutпотому что он гораздо более совместим с другим кодом, который вы найдете в Интернете.

Использование wcout для строк Unicode.

Я предполагаю, что вы компилируете свое приложение с переключателем компилятора Unicode, который обрабатывает все TCHAR как wchar_t. Следовательно, cout рассматривает argv как int.

Напишите вместо

wcout << argv[0] << L" "; 
wcout << argv[1] ;

или изменить на Use Multi-byte character установить в настройках проекта / Общие.

Другие вопросы по тегам