复制字符串数组时的结果错误

时间:2012-09-20 12:01:40

标签: c arrays pointers

我有以下代码:

#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]。我怎样才能解决这个问题?我想在循环之外进行测试()。

**

  

修改

** 在ANSWERS这里之后,这是我的新代码,它无效。谁能说出原因?

#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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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);

有了这些信息,你能修复你的程序吗?

答案 2 :(得分:0)

因为在每次迭代中都会覆盖指针userpasswd。因此,您只会看到最后一个字符串。

如果您能告诉您该计划的目标,可以提供更好的答案。因为我不确定您是否要阅读一个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;
}

答案 3 :(得分: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()