Невозможно распечатать значения argv [], используя std :: cout в VC ++ - PullRequest
1 голос
/ 11 ноября 2011

Это мой первый вопрос на сайте, хотя я уже давно сюда захожу для справки.Я понимаю, что 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 ]

5 голосов
/ 11 ноября 2011

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

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

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

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

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

2 голосов
/ 11 ноября 2011

Используйте wcout для строк Unicode.

0 голосов
/ 11 ноября 2011

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

Вместо этого напишите

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

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

...