0

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ます。

これはなぜですか?

4

2 に答える 2

1

以下は、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>

これらのどちらも問題の原因ではないと思いますが、どちらも未定義の動作を引き起こします。

于 2013-01-19T04:20:44.873 に答える