0

非常に基本的な質問。exeにドラッグしたファイルのファイル名を出力するプログラムを書いてみます。

主な引数については、このガイドに従いました: http://publications.gbdirect.co.uk/c_book/chapter10/arguments_to_main.html

これは私のコードです:

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"num arguments: "<<argc<<"\n";

    while(argc--)
        printf("%s\n", *argv++);

    cout<<"press any key";
    getchar();
    return 0;
}

しかし、出力されるのは次のとおりです。

ファイルをexeにドラッグ&ドロップせずに実行すると:

引数の数: 1

G

どれかキーを押してください

3つのファイルをドラッグ&ドロップすると、次のように出力されます:

引数の数: 4

G

G

G

G

どれかキーを押してください

アプリケーション名も、どのファイルの名前も「G」で始まっていません

どうしたの?

ありがとう!

4

4 に答える 4

5

Unicode を混在させているため、最初の文字しか取得していません。申し訳ありませんが、G を説明することはできません (すべてのファイルがドライブ G:? にある場合を除きます)。

while(argc--)
    _tprintf(_T("%s\n"), *argv++);

代わりは。

後付けで、sbiの答えに打ちのめされました:_tcout使用する a が見つかりません

_tcout << *argv++;

代わりに、C++ のままにしたい場合は、定義する必要があると思います。

#ifdef _UNICODE
#define _tcin wcin
#define _tcout wcout
#define _tcerr wcerr
#define _tclog wclog
#else
#define _tcin cin
#define _tcout cout
#define _tcerr cerr
#define _tclog clog
#endif

これはC++ですが、おそらく定義ではなく、何か他のものであるべきであり、私は何を100%確信していません.

于 2010-07-03T12:35:21.727 に答える
1

argv[0]は常に実行可能ファイルの名前です。(これargc > 0は常に真であることを意味します。) ワイド文字を出力したい場合 ( BICBWT に_TCHARマップすると思いますwchar_t)、ナロー出力を使用してはなりません。C++ では、出力ストリームを使用して出力が行われます。ワイド コンソール出力ストリームはstd::wcout.

#include <iostream>

//Beware, brain-compiled code ahead!
template< typename InpIt >
void output(InpIt begin, InpIt end)
{
  while(begin != end)
    std::wcout << *begin++ << L'\n';
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::wcout << L"num arguments: " << std::argc << L'\n';

    output(argv+1, argv+argc)

    return 0;
}

Rupが言及しているように、定義に応じて_TCHARその値(charまたは)を変更します。wchar_t

何よりもまず、この切り替えが本当に必要ですか? 実際には、幅の広い文字が必要な場合は、ほとんどの場合、実際に幅の広い文字が必要になり、プログラムは幅の狭い文字では正しく動作しません。
したがって、純粋なワイド文字に落ち着いて、切り替えを取り除き、上記のコードを記述どおりに使用できる可能性が非常に高くなります。

ただし、本当に切り替える必要がある場合は、狭いコンソール ストリームと広いコンソール ストリームを自分で切り替える必要があります。(これは、コンソール ストリーム オブジェクト、BTW にのみ当てはまります。独自のストリーム、たとえばファイル ストリームの場合は、 を使用_TCHARして、コンパイラに残りを理解させる ことができますstd::basic_ofstream<_TCHAR>。) これを行う 1 つの方法は、trait です。クラス:

//Beware, brain-compiled code ahead!
template< typename Char >
struct console_stream_traits; // leave undefined

template<>
struct console_stream_traits<char> {
  typedef std::basic_ostream<char> ostream;
  typedef std::basic_istream<char> istream;
  std::basic_ostream<char>& cout = std::cout;
  std::basic_ostream<char>& cerr = std::cerr;
  std::basic_ostream<char>& clog = std::clog;
  std::basic_istream<char>& cin  = std::cin;
};

template<>
struct console_stream_traits<wchar_t> {
  typedef std::basic_ostream<wchar_>  ostream;
  typedef std::basic_istream<wchar_>  istream;
  std::basic_ostream<wchar_t>& cout = std::wcout;
  std::basic_ostream<wchar_t>& cerr = std::wcerr;
  std::basic_ostream<wchar_t>& clog = std::wclog;
  std::basic_istream<wchar_t>& cin  = std::wcin;
};

typedef console_stream_traits<_TCHAR> my_ostream;
typedef my_console_stream_traits::ostream    my_ostream;
typedef my_console_stream_traits::ostream    my_ostream;

my_ostream& my_cout = my_console_stream_traits::cout;
my_ostream& my_cerr = my_console_stream_traits::cerr;
my_ostream& my_clog = my_console_stream_traits::clog;
my_istream& my_cin  = my_console_stream_traits::cin;

これにより、上記の関数のループは次のoutput()ようになります。

while(begin != end)
  my_cout << *begin++ << _T('\n');
于 2010-07-03T12:42:47.203 に答える
0

ASCII 'main' 関数を使用するだけで、すべて問題ありません。変化する

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

int main(int argc, char *argv[])
于 2010-07-03T12:44:38.807 に答える
-1

これを使って:

while(argc--)
    printf("%s\n", argv[argc]);
于 2010-07-03T12:23:12.350 に答える