2012-09-20 21 views
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]。我怎樣才能解決這個問題?我想在循環之外進行測試()。

**

編輯

** 這裏的答案,這是我的新代碼,這是不工作後。有誰可以說爲什麼?

#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; 
} 
+0

重新編輯:您需要'malloc(argc * sizeof(char *))'。你想要一個'char *'數組,但忘記'sizeof'參數中的'*'。你必須聲明'user'是'char **'。 –

+0

爲什麼我要neec char *和char ** ?!你能解釋一下嗎?我很困惑 –

+0

'argv [i]'是一個指向'char'的指針。你(試圖)把它分配給'user [i]',爲了這個工作,'user [i]'必須和'char *'兼容,所以用戶應該是'char *'的數組 - 比如' char * user [100];'如果事先知道大小 - 或者指向一個內存塊的指針_used_作爲'char *'的數組。 'user'指向的類型必須具有'char *'的大小才能使索引正常工作。用戶指向的東西必須具有'char *'的大小,並且它們被用作'char *',所以正確的事情是將它們聲明爲'char *','user'作爲指向'字符*'。 –

回答

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; 
} 
+0

我編輯了我的代碼。你能回答嗎? –

+0

@justAngela現在查看我的編輯。請注意''argc'在'test()'中是不可見的,因此你的代碼將無法編譯。 –

+0

我也編輯我的文章,但我的工作案例我使用char *而不是char **。你能告訴我爲什麼你在初始化數組時使用CHAR **而不是char *?謝謝 –

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; 
} 
+0

我的代碼比這複雜得多。我需要 –

+0

,也許你需要另一個,而不是這個。 – perreal

+0

我編輯我的代碼。請給出答案 –

0

當然;在test()中,除了循環變量之外,您不使用循環變量,而在main()中,您不斷覆蓋用戶和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); 

有了這些信息,你能修復你的程序嗎?

+0

我明白了。所以我需要一組用戶和密碼,不是嗎?我編輯了我的代碼。你能幫我解決嗎? –

+0

我不確定你想要做什麼。請指定具有參數的程序調用示例,以及您期望輸出看起來像什麼。 – Jens

0
$ cat trash.c 
#include <stdio.h> 
#include <string.h> 

void test(FILE* stream, char* usr, char* pass) { 
    fprintf(stream, "%[email protected]%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 
[email protected] 
[email protected] 
$ 

,如果你還叫strdup()不要忘記釋放內存,因爲所謂的strdup malloc()