Visual C ++ argv Frage
-
12-09-2019 - |
Frage
Ich habe einige Probleme mit Visual Studio 2008. Sehr einfaches Programm. Drucken Zeichenfolgen, die in als Argumente gesendet werden
Warum tut dies:
#include <iostream>
using namespace std;
int _tmain(int argc, char* argv[])
{
for (int c = 0; c < argc; c++)
{
cout << argv[c] << " ";
}
}
Für diese Argumente:
program.exe testing one two three
Ausgabe:
p t o t t
Ich habe versucht, dies zu tun mit gcc statt und dann habe ich die ganzen Strings.
Lösung
In der Standardeinstellung nimmt _tmain
Unicode-Strings als Argumente, aber cout
erwartet ANSI-Strings. Deshalb ist es nur ist das erste Zeichen jedes Strings drucken.
Wenn Sie die Unicode _tmain
verwenden möchten, müssen Sie es verwenden, um mit TCHAR
und wcout
wie folgt aus:
int _tmain(int argc, TCHAR* argv[])
{
for (int c = 0; c < argc; c++)
{
wcout << argv[c] << " ";
}
return 0;
}
Oder wenn Sie glücklich sind ANSI-Zeichenfolgen zu verwenden, verwenden Sie den normalen main
mit char
und cout
wie folgt aus:
int main(int argc, char* argv[])
{
for (int c = 0; c < argc; c++)
{
cout << argv[c] << " ";
}
return 0;
}
Ein bisschen mehr Detail: TCHAR
und _tmain
kann Unicode oder ANSI, abhängig von den Einstellungen des Compilers. Wenn UNICODE definiert ist, welche der Standard für neue Projekte ist, sprechen sie Unicode. Es UNICODE nicht definiert ist, sie ANSI sprechen. Also in der Theorie können Sie Code schreiben, der zwischen Unicode und ANSI nicht ändern müssen Builds -. Sie bei der Kompilierung können wählen, die Sie wünschen
Wenn diese nach unten fällt, ist mit cout
(ANSI) und wcout
(Unicode). Es gibt keine _tcout
oder gleichwertig. Aber Sie können trivialerweise selbst erstellen und verwenden, die:
#if defined(UNICODE)
#define _tcout wcout
#else
#define _tcout cout
#endif
int _tmain(int argc, TCHAR* argv[])
{
for (int c = 0; c < argc; c++)
{
_tcout << argv[c] << " ";
}
return 0;
}
Andere Tipps
Alle Beispiele zeigen Ihnen, wie das argv Element in der Standardausgabe zu drucken. Ich brauchte den Code für bespannen Umwandlung und ich verwenden, um diese:
string localeCode="en-us";
if(argc>1)
{
#define LOCALELEN 50
char localeArg[LOCALELEN+1];
size_t result=-1;
wcstombs_s(&result, localeArg, LOCALELEN, argv[1], LOCALELEN);
if(result)
{
localeCode.assign(localeArg);
}
#undef LOCALELEN
}