所以,我正在进行一项额外的实验室任务,要求我构建一个简单的登录程序,使用C读取studentID和密码。我试图使用strcmp()来验证ID和密码,但即使是比较的元素是正确的,程序将始终显示"错误的密码"。请帮我看看我的程序,任何帮助表示赞赏。提前致谢
以下是我的编码:
#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
char studentID[]="Clarance", password[]="123456", id[8], p[6];
int n=1, x, y;
do{
printf("\nStudent_ID:");
scanf("%s", &id);
printf("\nPassword:");
scanf("%s", &p);
x=strcmp(id, studentID);
y=strcmp(p, password);
if(x==0 && y==0){
printf("\nSucessfully Logged In");
}else {
printf("\nWrong Password, try again", 5-n);
getch();
n++;}
if(n>5){
printf("\nAccess Denied");
getch();
}
}while (n<=5);
}
答案 0 :(得分:0)
问题是如何你声明了常量字符串。
这就是我运行程序的原因:
...
char studentID[]="Clarance", password[]="123456";
...
ID stored: ''
ID read: 'Clarance'
Password stored: ''
Password read: '123456'
Wrong Password, try again
这就是我通过更改字符串声明得到的结果:
...
static const char studentID[]="Clarance", password[]="123456";
...
ID stored: 'Clarance'
ID read: 'Clarance'
Password stored: '123456'
Password read: '123456'
Sucessfully Logged In
以下是完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
static const char studentID[]="Clarance", password[]="123456";
char id[8], p[6];
int n=1, x, y;
printf("%lu %lu:", strlen(id), strlen(studentID));
do{
printf("\nStudent_ID:");
scanf("%s", &id);
fflush(stdout);
printf("\nPassword:");
scanf("%s", &p);
fflush(stdout);
x=strcmp(id, studentID);
y=strcmp(p, password);
if(x==0 && y==0){
printf("\nSucessfully Logged In");
}else {
printf("\nWrong Password, try again", 5-n);
getchar();
n++;}
if(n>5){
printf("\nAccess Denied");
getchar();
}
}while (n<=5);
}
问题是您错过了flush(stdio);
。
每当使用scanf
时,最好清理标准输入读缓冲区。 x函数允许这样做。
关于开发的说明:
rm myprog; gcc -o myprog main.c; ./myprog
rm: myprog: No such file or directory
main.c:16:21: warning: format specifies type 'char *' but the argument has type 'char (*)[8]' [-Wformat]
scanf("%s", &id);
~~ ^~~
main.c:20:21: warning: format specifies type 'char *' but the argument has type 'char (*)[6]' [-Wformat]
scanf("%s", &p);
~~ ^~
main.c:34:51: warning: data argument not used by format string [-Wformat-extra-args]
printf("\nWrong Password, try again", 5-n);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
3 warnings generated.
学习使用调试器。 gcc命令提供了一个非常简单的方法。看看我的输出。从这一点可以看出,你的程序很有效,但它并不完美,因为有三个警告。稍微研究一下,试着冷静地理解它们的意思,并试着弄清楚如何解决它们。
调试器在软件开发过程中非常重要。
有关常量字符串的说明:
请记住,变量或对象(如用户名和密码)通常来自数据库,但如果您的程序很简单且具有教育目的,那么修复这些变量以便它们不能在程序执行期间更改。换句话说,将只读属性分配给用户名和密码变量。在我发布的代码中,我进行了这些更改。
答案 1 :(得分:0)
这是我自己的解决方案版本。我知道它很简单但有效
#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
char studentID[]="Clarance", password[]="123456", id[20], p[20];
int n=1, x, y;
do{
printf("\nStudent_ID:");
scanf("%s", &id);
fflush(stdout);
printf("\nPassword:");
scanf("%s", &p);
fflush(stdout);
x=strcmp(id, studentID);
y=strcmp(p, password);
if(x==0 && y==0){
printf("\nSucessfully Logged In");
break;
}else {
printf("\nWrong Password, try again", 5-n);
getch();
n++;}
if(n>5){
printf("\nAccess Denied");
getch();
}
}while (n<=5);
}
答案 2 :(得分:0)
p []和id []的数组大小与字符串长度相同。实际上我们需要提供(length + 1)数组大小。这是考虑到最后的Null字符。 strcmp比较两个字符串直到空字符。
所以下面将是声明的数组。 char p [7],id [9];
如果您不想增加数组大小,请尝试使用strncmp(),其中可以提供第三个参数来指定要比较的字符总数。
答案 3 :(得分:-1)
#include <stdio.h>
int main(){
char LoginId[100];
char Password[100];
while(1){
printf("Welcome to the Login_System\n");
printf("Please Enter your LoginID\n");
gets(LoginId);
printf("Please Enter your Password\n");
gets(Password);
if(strcmp(LoginId,"User")==0){
if(strcmp(Password,"12345")==0){
printf("Hey,You are Welcome\n");
break;
}
}
else{
printf("Try Again!!\n");
}
}
return 0;
}