質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

8048閲覧

コンソールアプリで引数を出力したい

KTMEI

総合スコア44

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/12/27 08:25

当方、今までC#の経験のみで、C++初心者(2日目)です。
ほぼ触ったことがないので、細かい部分も教えていただきたいです。

現在、コンソールアプリケーションで、引数を渡した場合に、
引数の文字列を表示させるようにしています。以下がソースです。

C++

1#include "stdafx.h" 2#include <iostream> 3 4using namespace std; 5int _tmain(int argc, _TCHAR* argv[]) 6{ 7 int i; 8 printf("引数の総個数 = %d\n", argc); 9 for (i = 0; i < argc; i++) { 10 printf("%d番目の引数 = %s\n", i, argv[i]); 11 } 12 return 0; 13}

上記を引数「ABC」「DEF」「GHI」として実行したところ、
以下のような出力となります。

0番目の引数 = C
1番目の引数 = A
2番目の引数 = D
3番目の引数 = G

想定していたものは、以下だったのです。

0番目の引数 = C:\実行ファイル.exe
1番目の引数 = ABC
2番目の引数 = DEF
3番目の引数 = GHI

調べた範囲では、ポインタや配列の部分が関係していそう
と思ったのですが、わからなかったためまずは実行できる
サンプルを見てみて、動作したものから理解を深めたいと
思っています。

どのようにすれば、上記のような出力になりますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2016/12/27 08:29

開発環境を教えてください。VC++ですか?
guest

回答4

0

ベストアンサー

こんにちは。

いきなり深いところにハマッてしまいましたね。これは文字コードの問題です。

Visual C++をお使いと思いますが、_tmain()はVisual C++独自の拡張です。プロジェクトが「Unicode 文字セットを使用する」時、_TCHARはwchar_tと定義されます。

これはワイド文字と言われ、ほとんどのケースで1文字2バイトで表現されます。
そして、ASCII文字の場合、Unicodeは上位バイトは0下位バイトがASCIIコードとなります。
更にインテルCPUはリトル・エンディアンなのでメモリ上では下位バイト→上位バイトの順序で記録されます。
ということは、L"ABC"という文字列をchar文字列にすると"A\0B\0C\0\0"となります。
C/C++の文字列は0終端ですので、printf()の出力が"A"だけになってしまいます。

Visual Studioでプロジェクトのプロパティを開き、全般にある「文字セット」を「マルチ バイト文字セットを使用する」へ変更すれば意図通りの出力を得られると思います。
これにより_TCHARがcharと定義されますので。

なお、このモードでは文字コードはUTF-8ではなくSHIFT-JISになりますのでご注意下さい。

投稿2016/12/27 08:46

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KTMEI

2017/01/06 03:37

丁寧かつ迅速な回答ありがとうございました! 危うくハマってしまうところでした。 ありがとうございました。
guest

0

UNICODE文字列(wchar_t*) をprintfしたいなら、

C++

1#include <cstdio> 2#include <clocale> 3 4int main() { 5 const wchar_t* wstr = L"文字化けしない?"; 6 setlocale(LC_ALL, "ja-JP"); // コレ必須 7 printf("wstr = %S\n", wstr); // %s 改め %S 8}

<iostream> 使うなら

C++

1#include <iostream> 2#include <locale> 3 4int main() { 5 using namespace std; 6 const wchar_t* wstr = L"文字化けしない?"; 7 wcout.imbue(locale("ja-JP")); // コレ必須 8 wcout << L"wstr = " << wstr << endl; 9}

投稿2016/12/27 23:04

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KTMEI

2017/01/06 03:31

サンプルの記載ありがとうございました。 これからC++を勉強していくにあたって参考にさせていただきます。
guest

0

開発環境を聞いてから答えようと思ったのですが、Chironianさんに先を越されてしまいました(笑)。
で、別の観点から。

折角C++を使ってるのですからcoutを使いましょう。

C++

1cout << i << "番目の引数 = " << argv[i] << endl;

とすれば、Unicodeとかマルチバイトとかの文字コードの問題はなくなります。

投稿2016/12/27 09:03

編集2016/12/27 09:04
PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2016/12/27 22:53

ホント? ostream に operator<<(const wchar_t*) なインタフェースなんかないんじゃないの?
PineMatsu

2016/12/27 22:55

そうでしたorz。..
KTMEI

2017/01/06 03:35

C++の文法についてアドバイスありがとうございました!
guest

0

UNICODE ビルドなら、_tprintf もしくは std::wcout を使ってください。

投稿2016/12/27 10:01

編集2016/12/27 10:02
qt6hy

総合スコア149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KTMEI

2017/01/06 03:32

アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問