C语言登录程序编译警告及登录验证失效问题求助
问题分析与修复方案
1. 编译警告原因及解决
你定义的char user和char pass是单个字符类型,而"welcome"、"hi"是字符串字面量,本质是指向字符数组的指针(char*类型)。把指针赋值给单个char变量,编译器会把指针的地址值(整数)强制转成char类型,因此触发“initialization makes integer from pointer without a cast”警告。
解决方法:改用字符数组存储用户名和密码,数组大小要足够容纳输入的字符串加上结束符\0。比如定义char user[20]、char pass[20],既能存储输入内容,也能避免类型不匹配。
2. 登录验证失败原因及解决
C语言中,==运算符比较字符串时,对比的是两个字符串的内存地址,而非内容。user是你定义的数组地址,"welcome"是字符串字面量的地址,两者必然不同,所以即使输入正确,user=="welcome"的条件永远不成立,程序会执行else分支。
解决方法:使用标准库函数strcmp比较字符串内容,需要包含头文件<string.h>。strcmp(a, b)返回0时,表示两个字符串内容完全相同。
修正后的完整代码
#include<stdio.h> #include<string.h> // 引入strcmp所需的头文件 int main(){ char user[20]; // 用字符数组存储用户名,大小按需调整 printf("Enter UserName: "); scanf("%s", user); // 数组名本身就是地址,不需要加& char pass[20]; // 用字符数组存储密码 printf("Enter Password: "); scanf("%s", pass); // 用strcmp比较字符串内容,返回0表示相等 if(strcmp(user, "welcome") == 0 && strcmp(pass, "hi") == 0){ printf("Login Successful"); } else{ printf("Retry"); } return 0; }
补充细节:
- 使用
scanf("%s", user)时,数组名user本身就是指向数组首元素的指针,不需要加&,加了反而会导致类型不匹配。 - 定义字符数组时,要确保数组大小足够大,避免输入过长字符串导致缓冲区溢出。
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

