0

我的 C# 处于中级水平,因此为了学习经验,我正在尝试将 C++ 学习到类似的程度。从现在开始,作为一个完整的初学者,我尝试循环通过命令行参数来熟悉语法变化。这是代码:

#include "stdafx.h"

#include <iostream>

#include "CPP Sandbox.h"

using namespace std;

int main(int argc, _TCHAR* argv[])
{
    cout << "argc = " << argc << "\n";
    for (int i = 0; i < argc; i++)
    {
        cout << argv[i] << "\n";
    }

}

我在 Visual Studio 2012 中工作,并尝试使用以下参数运行程序;

测试 -p argc alnsot

通过 Debug > CPP Sandbox Properties > Configuration Properties > Debugging > Arguments 设置。

我认为应用程序的意图很清楚,但它不是输出参数,而是输出看似随机的(每次尝试更改)4字节十六进制字符串(第一个字节和第二个字节总是相等,第三个等于最后四个)。示例输出为:

argc = 5

00CE89E8

00CE8A44

00CE8A49

00CE8A4C

00CE8A51

我究竟做错了什么?另外,第一个参数是什么,它总是存在但每次运行都不同?如果我对一个明显的错误视而不见,请原谅我,但谷歌什么也没说。

4

4 回答 4

1

您可以使用 _tprintf 来执行您的要求或对 tcout 之类的内容进行自己的定义:

//tstream.h
#ifndef TSTREAM_H
#define TSTREAM_H 1

#include <iostream>
#ifdef _UNICODE
std::wostream& tcout = std::wcout;
#else
std::ostream& tcout = std::cout;
#endif

#endif //!TSTREAM_H

当然,您可以以相同的方式将其扩展为 tcin 和 tclog 之类的东西。

于 2013-07-03T21:08:35.697 回答
0

而不是使用 a _TCHAR,它可能会更简单(并且可能使它工作)来char代替使​​用 normal 。

要回答您的第二个问题,在 C# 中,string[] args仅填充了传递给您的程序的参数。在 C/C++ 中,argv填充有编译程序的路径,然后填充实际参数。

于 2013-07-03T20:01:48.593 回答
0

我会和

int main(int argc, char** argv)
{
   //...
}

标准,比 MSVC_TCHAR也一直让我感到困惑......

于 2013-07-03T20:03:04.270 回答
0

要修复编写的代码,使其适用于任何编译器选项:

int main(int argc, _TCHAR* argv[])
{
    cout << "argc = " << argc << "\n";
    for (int i = 0; i < argc; i++)
    {
        cout << (char*)argv[i] << endl;  // shows how broken main(_TCHAR) is

        char szTemp[1024] = {0};
        sprintf_s(szTemp, "%s", argv[i]); // works but... isn't wcstombs()
        cout << szTemp << "\n";

        // -or- much simpler:
        printf("%s\n", argv[i]);    // printf seems to naturally handle _TCHAR*
    }
}

在漫长的周末,我意识到这一切都是错误的:

int main(int argc, _TCHAR* argv[]) // completely invalid TCHAR / char * mix

有效的选择是:

int _tmain(int argc, _TCHAR* argv[]) // project options choose char type
int main(int argc, char **argv)      // always use char * for command line input

您可以通过以下四种方式使用该TCHAR设置:

#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <atlbase.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{    
    cout << "argc = " << argc << "\n";
    for (int i = 0; i < argc; i++)
    {
        USES_CONVERSION;
        char *pszArg = T2A(argv[i]);  // ATL conversion macros
        cout << pszArg << endl;       // I recommend this unless no ATL at all.

        char szChar[1024] = {0};
        size_t useless;
        wcstombs_s(&useless, szChar, argv[i], 1024); // TCHAR is wchar_t only
        cout << szChar << endl; 

        wstring ws = argv[i];
        string s(ws.begin(), ws.end());  // C++ std::string TCHAR is wchar_t
        cout << s.c_str() << endl;

        _setmode(_fileno(stdout), _O_WTEXT); // _O_WTEXT _O_U16TEXT
        wcout << argv[i] << endl;        // C++ std::wcout kind of dicey...
        _setmode(_fileno(stdout), _O_TEXT);
}
于 2013-07-03T20:36:44.133 回答