带文件的分段错误(核心转储)(C-linux)

时间:2018-05-03 23:56:08

标签: c linux

我尝试运行时遇到分段错误(核心转储)。它编译得很完美,但我得到了错误,我不知道为什么。文件写入一定存在问题,因为没有这个工作就好了。任何帮助都会很棒。谢谢!

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <crypt.h>
#include <string.h>

int
main(void)
{

FILE *f=fopen("shadow1.txt","w");


  if (f=NULL)
  {
    printf("ERROR");

  }


  unsigned long seed[2];
  char salt[] = "$1$........";
  const char *const seedchars =
    "./0123456789ABCDEFGHIJKLMNOPQRST"
    "UVWXYZabcdefghijklmnopqrstuvwxyz";
  char *password;
  int i;

  /* Generate a (not very) random seed.
     You should do it better than this... */
  seed[0] = time(NULL);
  seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);

  /* Turn it into printable characters from ‘seedchars’. */
  for (i = 0; i < 8; i++)
    salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f];

  /* Read in the user’s password and encrypt it. */
  password = crypt(getpass("Password:"), salt);

  /* Print the results. */
  //fprintf(f,"%s $ %s",password);
  printf("Success Registration to file !");
  fclose(f);
  return 0;

}

3 个答案:

答案 0 :(得分:2)

 if (f=NULL)
  {
    printf("ERROR");

  }

是问题......

答案 1 :(得分:1)

void Register(char u,char p) {

你可能希望这些是char *,因为fprintf会将它们视为字符串:

fprintf(f,"%s $ %s",u,p);

并且因为你传递了char *

char *password,*username;
//...
Register(username,password);

这很可能是由编译器警告捕获的。从编译器获得答案比从这里获得答案快得多。

如果您无法弄清楚程序无法正常运行的原因,您可以使用-Wall -Wextra启用所需的所有警告,并使用-Werror将警告变为错误。

答案 2 :(得分:1)

您没有分配空间来保存用户名,因此它会在scanf上发生段错误。