gpt4 book ai didi

c - malloc + fgets 动态分配

转载 作者:行者123 更新时间:2023-11-30 14:24:44 25 4
gpt4 key购买 nike

这是我的代码:

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. 将值sizeof(line)写入fgets是否正确。我的疑问是 line 包含一个指针,因此它始终是 4 或 8 个字节...
  2. line 分配正确吗?

最佳答案

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

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

    然后使用该尺寸作为线条的尺寸。 (顺便说一句:你的代码没有空闲线。)

    编辑:实际上,由于您最终想要读取 strtok 搜索到的用户 + 密码 + 2 个 token 分隔符,因此您需要添加额外的 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. 奖励您应该检查tmptmp2对于 NULL , 万一。调用strcmpNULL参数会导致段错误。这很重要:如果读取的行包含的用户名+密码比之前提供的长,则 fgets 和 strtok 将不会读取 token 分隔符,无法找到例如最后的“\n”字符,返回 NULL。

关于c - malloc + fgets 动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com