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