0

私は次のコードを持っています:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* user;
char* passwd;
int nr;

void test()
{
    int i=0;
    for(i=0;i<argc;i++)
    printf("Hello %s \n",user);
}

int main(int argc,char*argv[])
{
    int i;
    nr=argc;
    for (i=0; i<argc; i++)
    {
        user=strdup(argv[i]);

    }

    test();
return 0;
}

結果はargv[argc]すべてのポジションにあります。どうすればこれを修正できますか?そのtest()をループの外に置きたいです。

**

編集

**ここでの回答の後、これは私の新しいコードであり、機能していません。誰もが理由を言うことができますか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* user;


void test(int n)
{
    int i=0;
    for(i=0;i<n;i++)
    printf("%s \n",user[i]);
}
int main(int argc,char*argv[])
{
     user = (char*) malloc(argc*sizeof(char));
int i;
for (i=0;i<argc;i++)
{
user[i]=argv[i];
}
test(argc);
return 0;
}
4

4 に答える 4

1

forループの繰り返しごとに、パスワードとユーザーの両方に割り当てています。表示される最終的な値は、最後の反復からのものです。strdupまた、以前の呼び出しからのポインタを上書きすることによるメモリ リークがあります。実際、ループは必要ありません。

int main(int argc,char*argv[])
{
  if(argc == 3) {
    user=strdup(argv[1]);
    passwd=strdup(argv[2]);
  } else {
    // error: usage
  }
  test();
  return 0;
}

複数のユーザー/パスワードの組み合わせが必要な場合:

char *user[256], *passwd[256]; 

void test(int n) {
  int i;
  for(i=0;i<n;i++)
    printf("Hello %s \n",user[i]);
}

int main(int argc,char*argv[])
{
  int i;
  for(i = 0; i < argc && i < 256; i+=2) {
    user[i]=strdup(argv[i]);
    passwd[i]=strdup(argv[i+1]);
  } 
  test(argc);
  return 0;
}
于 2012-09-20T12:05:51.020 に答える
0
$ cat trash.c
#include <stdio.h>
#include <string.h>

void test(FILE* stream, char* usr, char* pass) {
    fprintf( stream, "%s@%s\n", usr, pass);
}

int main(int argc, char** argv) {

    int i = 1;
    if (argc % 2) {

        while(argv[i]) {

            test(stdout, argv[i], argv[i + 1]);
            i += 2;
        }
    }
    return 0;
}

$ clang trash.c
$ ./a.out user1 pass1 user2 pass2
user1@pass1
user2@pass2
$

また、 strdup が呼び出されるため、呼び出す場合はstrdup()メモリを解放することを忘れないでくださいmalloc()

于 2012-09-20T12:30:01.037 に答える
0

もちろん; test() ではループ変数以外に i を使用せず、main() では user と passwd の以前の値を上書きし続けます。実際には、次のことを行います。

user   = strdup(argv[0]);  /* Note: argv[0] is the program name. */
passwd = strdup(argv[0]);
user   = strdup(argv[1]);
passwd = strdup(argv[1]);
user   = strdup(argv[2]);
passwd = strdup(argv[2]);
user   = strdup(argv[3]);
passwd = strdup(argv[3]);
printf("%s %s \n", user, passwd);

この情報を使用して、プログラムを修正できますか?

于 2012-09-20T12:07:27.960 に答える
0

ポインターを上書きし、すべての反復で上書きするためuserですpasswd。したがって、最後の文字列のみが表示されます。

プログラムの目的を教えていただければ、より適切な回答が得られます。ユーザーとパスワードの配列または配列userを読みたいのかどうかわからないからです。passwd

編集後、文字列の配列を読みたいことがわかりました。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char** user;
// or char *user[100]; /* If you want a fix length array of pointers. Now, you dont have to malloc. /*
char* passwd;
int nr;

void test(int argc)
{
    int i=0;
    for(i=0;i<argc;i++)
    printf("Hello %s \n",user[i]);
}

int main(int argc,char*argv[])
{
    int i;
    nr=argc;
    user = malloc(argc*sizeof(char*));

    for (i=0; i<argc; i++)
    {
        user[i]=strdup(argv[i]);

    }
    test(argc);
return 0;
}
于 2012-09-20T12:08:42.873 に答える