0

这是我的代码:

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. 写入fgets值是否正确sizeof(line)。我怀疑它line包含一个指针,所以它总是 4 或 8 个字节......
  2. line分配对了吗?
4

2 回答 2

2
  1. 不, sizeof(line) 将返回指针的大小。你真正想做的只是

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

    然后只需使用该大小作为线的大小。(顺便说一句:您的代码没有自由行。)

    编辑:实际上,由于您最终想要读取 strtok 搜索的用户 + 密码 + 2 个标记分隔符,因此您想要添加额外的 3 个字符:1 用于终止 \0,1 用于第一个分隔符“”,1 用于下一个分隔符“ \n'。所以应该是:

    size_t size_required = strlen(user) + strlen(pass) + 3; /* Don't forget about \0! */
    
  2. 您应该记住,动态分配的 m 说明符是非标准扩展。它不适用于某些系统。user并且pass 只有当他们的 scanf 调用返回正值(如:如果他们成功)时,您才应该释放。

  3. 的分配line不正确:您分配的一个字符太少,因此终止 \0 字符不适合(见上文)。请注意,strlen返回字符串大小不包括终止 \0 字符。

    此外,sizeof(char)毫无意义。标准保证sizeof(char)正好是 1(因为sizeof实际上并没有返回字节数,而是覆盖参数的位表示所需的字符数)。

  4. 奖金您应该检查tmptmp2NULL以防万一。调用参数strcmpNULL导致分段错误。这很重要:如果读取的行包含的用户+密码比之前提供的长,则 fgets 将不会读取标记分隔符,并且 strtok 无法找到,例如最后的 '\n' 字符,返回 NULL。

于 2012-06-26T20:29:00.967 回答
0

Q:将值sizeof(line)写入fgets是否正确?

答:没有:)

因为,正如您所说,它只有 4 个(或 8 个)字节。

我完全不确定您要做什么。也许是这样的?

#define MAXLINE 80

char *user, *pass, line[MAXLINE];
scanf ("%s", line);
user = malloc(strlen(line)+1);
strcpy (user, line);
...
于 2012-06-26T19:53:00.670 回答