2016-04-11 46 views
5

私はuserIDとpaswdと何らかのエラーチェックを解析する関数を使用しています。この関数は私のmain()から呼び出されます...しかし、実行されると、私のUserIDとPswdの最初の4文字だけが正常に抽出されます。私はCプログラミングの新人で、C#から来ています。どこに間違っているのか分かりません。これはかなり簡単に、誰かが正しい方向に私を指すことができますか?私は外部関数を使用してから、私のメインFUNCそれが動作中のすべてのコードをお持ちでない場合は 関数に文字配列を渡すCプログラミング

static void func1(int argc, char *argv[], char *UserID[30], char *Psw[30]) 
{ 
    strncpy(UserID, argv[1], sizeof(UserID)); 
    strncpy(Psw, argv[2], sizeof(Psw)); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[30];       
    char Psw[30]; 
    func1(argc, argv, UserID, Psw); 
} 

はまた、ただ、指摘します。

EDIT: - :私はそれは...それは常に私のポインタのサイズを読んでいたことが予想ほど

static void func1(int argc, char *argv[], char *UserID, char *Psw) 
{ 
    strncpy(UserID, argv[1], UserIDMaxSize); 
    strncpy(Psw, argv[2], PswMaxSize); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[UserIDMaxSize + 1]; /* max val defined in a header file */       
    char Psw[PswMaxSize + 1]; /* max val defined in a header file */ 
    func1(argc, argv, UserID, Psw); 
} 

はsizeof doesntの仕事 - 問題を考え出した

デフォルトでは4文字です。

+4

によってオフを与えました –

+0

'function': 'char *'は 'char **'からの間接的なレベルが異なります – Philo

+0

'strncpy':正式なパラメータと実際のパラメータの異なるタイプ1 – Philo

答えて

1

は、先の配列がNULL終端文字です保証するための機能に

static void func1(int argc, char *argv[], char *UserID, size_t UserIDSize, 
    char *Psw, size_t PswSize) 
{ 
    if (argc> 1) strncpy(UserID, argv[1], UserIDSize); 
    if (argc> 2) strncpy(Psw, argv[2], PswSize); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[30] = {0};  
    char Psw[30] = {0}; 
    func1(argc, argv, UserID, sizeof UserID, Psw, sizeof Psw); 
} 

を配列のサイズを渡し、strncat()示唆 - 終端のNULL文字は常にに追加される」>を結果。「strncpy()は、あまりにも多くの問題を抱えている、それは常にnull文字の配列にはなりません

static void func1(int argc, char *argv[], char *UserID, size_t UserIDSize, 
    char *Psw, size_t PswSize) { 
    UserId[0] = '\0'; 
    // if (argc> 1) strncat(UserID, argv[1], UserIDSize); 
    if (argc> 1) strncat(UserID, argv[1], UserIDSize - 1); 
    Psw[0] = '\0'; 
    // if (argc> 2) strncat(Psw, argv[2], PswSize); 
    if (argc> 2) strncat(Psw, argv[2], PswSize - 1); 
} 

[編集]

修正したコード - 。コンパイラはあなたにすべての警告を1

1

TL; DR

sizeofあなたが期待している何をしていません。代わりにstrlenを使用してみてください。


あなただけの任意のNためsizeof(char*[N])だけでポインタのサイズであることを行っているので、コピーされた4つの文字を取得しています。プラットフォーム上では、ポインタは4バイト(32ビット)でなければなりません。

実際には配列のベースアドレスを関数に渡すことを意味しますが、その場合は型が正しくないと思います。あなたのコンパイラはこれについてあなたに警告する必要があります。あなたは、最後の2つの引数の型から*を削除する必要があります。

static void func1(int argc, char *argv[], char UserID[30], char Psw[30]) 

警告を取り除く必要があり、それが実際に(sizeof(char[30])が30であるため)sizeofは同様に正常に動作させる必要があること。しかし、char*char[]の振る舞いが異なるので、sizeofで間違いを犯すのは非常に簡単です...ここでは、代わりにstrlen(またはバッファオーバーフローの可能性を避けたい場合はstrnlen)を使用することをお勧めします。あなたが持っている多くのヌル以外の文字。 strnlenではなくsizeofを使用して

も、それはあなたがchar*を期待する関数にchar**を渡すためにしようとしていると文句を言うだろうから、あなたのパラメータの型が間違っていることを密告するのに役立つでしょう。

+0

を付けるべきです。コード内にstrlenを使用すると、私のuserIDとPswdでは、残りの文字はヌルで終了しています....また、外部関数を使用せず、メイン関数のすべてのコードを持っていれば、それが機能します。 – Philo

+0

Scott Hunter氏がコメントで指摘したように、タイプの不一致があるため、このコードでコンパイラの警告が表示されるはずです。これらの警告を修正すると、うまくいくでしょう。 – DaoWen

2

あなたのポインタは4バイトのサイズを持っていると思います。したがって、あなたは4文字しか読みません。

+0

あなたのポイントは私に手がかりを与えました。ありがとう。 – Philo

-1

ソリューション

#include <stdio.h> 
#include <string.h> 
void func1(int argc, char *argv[], char *UserID, char *Psw) 
{ 
    strncpy(UserID, argv[1], strlen(argv[1])); 
    strncpy(Psw, argv[2], strlen(argv[2])); 
printf("DATA: %s \n",UserID); 
printf("DATA1: %s \n",Psw); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[30]; 
    char Psw[30]; 
     printf("argv1 %ld \n",strlen(argv[1])); 
     printf("argv2 %ld \n",strlen(argv[2])); 
    func1(argc, argv, UserID, Psw); 
} 
+0

でも同じ問題がありますが、最初の4文字の – Philo

+1

のインデントが一貫していれば、このコードは私たちの人間によってはるかに読みやすくなります。 – user3629249

関連する問題