You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:40:29