2012-06-26 57 views
0

這是我的代碼:
的malloc + FGETS動態分配

int main(int argc, char *argv[]){ 
    FILE *fp; 
    char *tmp, *tmp2, *user, *pass, *line; 
    printf("Inserire utente: "); scanf("%ms", &user); /* scanf %ms alloca dinamicamente la memoria */ 
    printf("Inserire password: "); scanf("%ms", &pass); 
    line = malloc((strlen(user)+strlen(pass)) * sizeof(char)); /* DUBBIOOOOOOOOOO */ 
    fp = fopen("/home/pol/auth.txt", "r"); 
    if(fp == NULL){ 
     printf("Errore apertura file\n"); 
     return EXIT_FAILURE; 
    } 
    while(!feof(fp)){ 
     fgets(line, /* E QUI?? */ , fp); 
     tmp = strtok(line, " "); 
     tmp2 = strtok(NULL, "\n"); /* con fgets ultimo carattere è \n (se pwd=12 => 12\n) quindi devo tagliare prima di \n */ 
     if((strcmp(tmp,user) == 0) && (strcmp(tmp2,pass) == 0)){ 
      printf("USER: %s - PASS: %s\n", tmp, tmp2); 
      free(user); 
      free(pass); 
      return EXIT_SUCCESS; 
     } 
     else{ 
      printf("Utente o password errati o non presenti nel DB\n"); 
      free(user); 
      free(pass); 
      return EXIT_FAILURE; 
     } 
    } 
    return EXIT_SUCCESS; 
} 

我想知道:

  1. 它是正確的寫入fgetssizeof(line)與否。我的疑問是,line包含一個指針,因此它總是4首或8個字節...
  2. line是正確的分配呢?
+0

是的,但沒有,沒有。你想在這裏做什麼? –

+0

其實,「不」,「是」和「是」? ;)不,我不知道他在這裏嘗試實現什麼;) – paulsm4

+0

我想爲用戶和通過動態分配字符。那麼我想分配到用戶+通過總和:) – polslinux

回答

2
  1. 不,的sizeof(線)將返回指針的大小。你真正想做的只是

    size_t size_required = strlen(user) + strlen(pass) + 1; /* Don't forget about \0! */ 
    

    然後只是使用該大小作爲行的大小。 (順便說一句:您的代碼不免費線。)

    編輯:實際上,因爲你最終要讀有+ 2個令牌分隔搜索由strtok的,你要添加額外的3個字符的用戶+密碼:1終止\ 0,1爲第一個分隔符'',1爲下一個分隔符'\ n'。所以這應該是:

    size_t size_required = strlen(user) + strlen(pass) + 3; /* Don't forget about \0! */ 
    
  2. 你應該記住,是m符用於動態分配是一個非標準擴展。它在某些系統上不起作用。你應該釋放userpass只有,如果他們的scanf函數調用返回正值(如:如果他們成功了)。

  3. line分配是不正確:您分配一個角色太少了,所以終止\ 0性格不適合(見上文)。請注意,strlen返回字符串大小,不包括終止\ 0字符。

    此外,sizeof(char)是毫無意義的。該標準保證了sizeof(char)正好是1(因爲sizeof並沒有真正恢復的字節數,但涵蓋的說法位表示所需字符數)。

  4. BONUS你應該檢查tmptmp2NULL,以防萬一。在NULL參數上調用strcmp會導致分段錯誤。這是重要:如果讀行包含用戶+密碼長於先前提供,令牌分離不會被與fgets讀取,並且strtok的,無法找到,例如,最後的「\ n」字符,回報空值。

+0

應你的代碼是+2?因爲我有2個字符串,所以2'\ 0':) – polslinux

+0

你有2個字符串,但最終你只能讀1個,對吧? ;)fgets最多隻能讀取n-1個字符,並添加最後一個*一個*終止字符。然後再次,你想用標記分隔符來讀取它,所以你應該使用+3(\ 0 +''+'\ n')。我相應地更新了答案。 –

+0

是啊:)我明白了:)非常感謝:D – polslinux

0

問:是否正確寫入到與fgets值的sizeof(線)?

答:沒有:)

因爲,如你所說,這是隻有4個(或8)個字節。

我不能肯定你想要做什麼。也許這樣?

#define MAXLINE 80 

char *user, *pass, line[MAXLINE]; 
scanf ("%s", line); 
user = malloc(strlen(line)+1); 
strcpy (user, line); 
... 
+0

我想動態分配用戶和通過字符。然後我要分配到線的用戶+總和傳遞:) – polslinux

+0

我寫的所有代碼:) – polslinux