argv[1]
入力されたものよりも 1 文字余分に返されるようです。 argv[2]
正しい。
#include <stdio.h>
int main(int argc, wchar_t *argv[])
{
printf("%d %d\n",wcslen(argv[1]),wcslen(argv[2]) );
return 0;
}
mingw32 を使用してコンパイルしています。でコンパイルしgcc myprog.c
ます。
これはなぜですか?
以下は、C 標準ドラフト n1570.pdf からの引用です。
5.1.2.2.1 プログラムの起動
1プログラムの起動時に呼び出される関数の名前は main です。実装は、この関数のプロトタイプを宣言していません。これは、戻り値の型が int で、パラメーターなしで定義されます。
int main(void) { /* ... */ }
または 2 つのパラメーター (ここでは argc および argv と呼ばれますが、宣言されている関数に対してローカルであるため、任意の名前を使用できます):
int main(int argc, char *argv[]) { /* ... */ }
または同等のもの; 10)または他の実装定義の方法で。
10) したがって、int を int として定義された typedef 名に置き換えるか、argv の型を char ** argv などと書くことができます。
これはかなり簡単に理解できるはずです。argv
実装が typeをサポートしている場合、wchar_t**
実装で定義された方法で実装で動作します。移植性が必要な場合は、実装定義に依存しないでください。
さらに、wcslen()
は値を返すように宣言されています。これは、表示するディレクティブでsize_t
使用する必要があります。また、 .%zu
#include <wchar.h>
これらのどちらも問題の原因ではないと思いますが、どちらも未定義の動作を引き起こします。