Невозможно распечатать значения 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
потому что он гораздо более совместим с другим кодом, который вы найдете в Интернете.
Я предполагаю, что вы компилируете свое приложение с переключателем компилятора Unicode, который обрабатывает все TCHAR как wchar_t. Следовательно, cout рассматривает argv как int.
Напишите вместо
wcout << argv[0] << L" ";
wcout << argv[1] ;
или изменить на Use Multi-byte character
установить в настройках проекта / Общие.