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

当然; 在 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因此,您只会看到最后一个字符串。

如果您能说出您的程序目标,则可以提供更好的答案。因为我不确定您是否要读取一个userpasswd或一组用户和密码。

编辑后,我看到您想读取字符串数组:

#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 回答
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 回答