Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C编写的小程序_C - Fatal编程技术网

用C编写的小程序

用C编写的小程序,c,C,我是C语言编程新手,我的小作业需要帮助 C程序的要求: 要求用户在命令行输入中键入用户名和密码 程序应要求至少两次用户尝试输入密码。只有当用户输入了两个相同的密码时,您的程序才会终止 程序应将用户名和密码对存储到当前目录中名为“user.dat”的文本文件中 我的代码似乎输出到文件中,但在命令提示窗口中出现以下错误: free(): double free detected in tcache2 Aborted 我还需要在代码中的某个地方放置一个循环 密码不匹配,请返回并提示重新输入- 输入,

我是C语言编程新手,我的小作业需要帮助

C程序的要求:

  • 要求用户在命令行输入中键入用户名和密码
  • 程序应要求至少两次用户尝试输入密码。只有当用户输入了两个相同的密码时,您的程序才会终止
  • 程序应将用户名和密码对存储到当前目录中名为“user.dat”的文本文件中
  • 我的代码似乎输出到文件中,但在命令提示窗口中出现以下错误:

    free(): double free detected in tcache2 Aborted
    
    我还需要在代码中的某个地方放置一个循环 密码不匹配,请返回并提示重新输入- 输入,此时我的程序刚刚
    打印“您的密码不匹配,请重新输入” 密码我不知道如何接近 它

    以下是我写的:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      char username [40];
      char pw [35];
      char confirmpw [35];
    
      FILE *fptr;
    
      fptr = fopen("user.dat", "w");
    
      // exiting program
      if (fptr == NULL) {
        printf("Error!");
        exit(1);
      }
    
      printf("Please Enter Your Username:\n");
      fgets(username, sizeof(username), stdin);
      fprintf(fptr, "%s", username);
    
      printf("please Enter Your Password:\n");
      fgets(pw, sizeof(pw), stdin);
    
      // Confirm password prompt
      printf("please Re-Enter to Confirm Your Password\n");
      fgets(confirmpw, sizeof(confirmpw), stdin);
    
      if(strcmp(pw, confirmpw) == 0){
        fprintf(fptr, "%s", pw);
        fclose(fptr);
      } else {
        printf("Your passwords did not match please re-enter your password \n");
        //need some type of loop ?
      }
    
      fclose(fptr);
      return 0;
    }
    
    
    #包括
    #包括
    int main()
    {
    字符用户名[40];
    char-pw[35];
    char confirmpw[35];
    文件*fptr;
    fptr=fopen(“user.dat”,“w”);
    //退出程序
    如果(fptr==NULL){
    printf(“错误!”);
    出口(1);
    }
    printf(“请输入您的用户名:\n”);
    fgets(用户名、sizeof(用户名)、标准输入法);
    fprintf(fptr,“%s”,用户名);
    printf(“请输入密码:\n”);
    fgets(pw,sizeof(pw),stdin);
    //确认密码提示
    printf(“请重新输入以确认密码”);
    fgets(confirmpw、sizeof(confirmpw)、stdin);
    如果(strcmp(pw,confirmpw)==0){
    fprintf(fptr,“%s”,pw);
    fclose(fptr);
    }否则{
    printf(“您的密码不匹配,请重新输入您的密码\n”);
    //需要某种类型的循环吗?
    }
    fclose(fptr);
    返回0;
    }
    
    如果一切顺利,您将调用
    fclose()
    两次:第一个在
    fprintf()
    之后,第二个在
    返回0之前;
    。您应该只调用一次,但我想这是一个简单的错误,您已经知道了。在内部
    fclose()
    可以调用
    free()
    这就是您看到该错误的原因


    至于您的循环,我建议使用
    do{…}while();
    。在while条件中,您应该调用
    strcmp()

    放置while循环而不是if语句来请求新密码,直到确认密码正确为止

    请注意,您在代码中关闭了文件两次,一次在if语句中,第二次在main结尾

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char username [40];
        char pw [35];
        char confirmpw [35];
    
    
        FILE *fptr;
    
    
        fptr = fopen("user.dat", "w");
    
        // exiting program
        if (fptr == NULL)
        {
            printf("Error!");
            exit(1);
        }
    
    
        printf("Please Enter Your Username:\n");
        fgets(username, sizeof(username), stdin);
        fprintf(fptr, "%s", username);
    
    
    
    
        printf("please Enter Your Password:\n");
        fgets(pw, sizeof(pw), stdin);
    
    
        // Confirm password prompt
    
        printf("please Re-Enter to Confirm Your Password\n");
        fgets(confirmpw, sizeof(confirmpw), stdin);
    
        while(strcmp(pw, confirmpw) != 0)
        {
            printf("Your passwords did not match please re-enter your password \n");
    
            fgets(confirmpw, sizeof(confirmpw), stdin);
        }
    
    
    
        fprintf(fptr, "%s", pw);
    
        fclose(fptr);
        return 0;
    }
    
    #包括
    #包括
    int main()
    {
    字符用户名[40];
    char-pw[35];
    char confirmpw[35];
    文件*fptr;
    fptr=fopen(“user.dat”,“w”);
    //退出程序
    如果(fptr==NULL)
    {
    printf(“错误!”);
    出口(1);
    }
    printf(“请输入您的用户名:\n”);
    fgets(用户名、sizeof(用户名)、标准输入法);
    fprintf(fptr,“%s”,用户名);
    printf(“请输入密码:\n”);
    fgets(pw,sizeof(pw),stdin);
    //确认密码提示
    printf(“请重新输入以确认密码”);
    fgets(confirmpw、sizeof(confirmpw)、stdin);
    while(strcmp(pw,confirmpw)!=0)
    {
    printf(“您的密码不匹配,请重新输入您的密码\n”);
    fgets(confirmpw、sizeof(confirmpw)、stdin);
    }
    fprintf(fptr,“%s”,pw);
    fclose(fptr);
    返回0;
    }
    
    让我们从顶部开始。当我试图按照编写的方式编译您的程序时,我发现您缺少一个#include:

    为了解决这个问题,我补充道

    #include <string.h>
    
    
    这就是它的作用:

    $ gcc -o t2 t.c && ./t2
    please Enter '12345': 12
    Incorrect input.  Please try again.
    please Enter '12345': 45
    Incorrect input.  Please try again.
    please Enter '12345': 12345
    $ 
    

    最后一点注意:我的比较字符串包含
    \n
    。这是因为“在终端输入文本时,键被传递到程序中。这对您来说不一定是个问题,因为换行符是要比较的两个字符串的一部分,但我想指出的是,换行符将与密码的其余部分一起写入目标文件。

    double free意味着您两次释放了一些内存。你能看到哪个内存吗?在刚开始学习C语言的人身上看到这样一个格式良好的代码真是太好了。这是一件非常重要的事情:)当密码不匹配时,请求密码的程序通常会再次请求两次。如果我把同一个东西打错了两次,我就不太相信自己了,所以我更希望程序忘记我键入的所有内容。我想你也可以尝试一下——也许可以使用一个函数来包含重复使用的
    fgets
    callI我不想在你的答案中产生太大影响,但随着他的学习,看起来他或多或少都知道自己在做什么,我认为让他自己编写实际的代码对他来说是更好的,而谷歌只需要一些线索就可以找到解决方案。我将保留这个答案,它是正确的,但可以改进。有了这句话,他自己应该可以做得更好:)@Cacahuete Frito OkayI将在那里讨论对位法。与google搜索关键字相比,一个最小的工作代码示例是非常宝贵的。OP已经知道他们需要一个循环。这也不意味着你必须为他们完成作业。因此,现在遭受了诸如“使用do/while循环”等过于简短的不可验证的答案的折磨,并且遭受了更多的折磨——来自没有可验证代码的问题——被排除在外的问题。“要么执行,要么不执行”是我的口头禅。很好的建议,但代码很简单examples@DanielFarrell在他学习的过程中,看起来他或多或少都知道自己在做什么,我认为让他自己编写实际的代码,让谷歌提供一些线索,这对他的学习来说是更好的。有了这个答案,他应该能够自己去做,并找到如何去做。除此之外,我很乐意更明确一点:)谢谢大家的帮助,非常感谢关于编译器警告的帮助,我以后会注意到这一点。谢谢回答得很好;)
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
      char* expected = "12345\n";
      char entered[25];
      while(1) {
        printf("please Enter '12345': ");
        fgets(entered, sizeof(entered), stdin);
        if(strcmp(expected, entered) == 0){
          break;
        } else {
          printf("Incorrect input.  Please try again.  \n");
        }
      }
      return 0;
    }
    
    $ gcc -o t2 t.c && ./t2
    please Enter '12345': 12
    Incorrect input.  Please try again.
    please Enter '12345': 45
    Incorrect input.  Please try again.
    please Enter '12345': 12345
    $