警告:初始化使指针整数而不强制转换,即使我输入了正确的用户和密码,输出也只显示其他部分

warning: initialization makes integer from pointer without a cast and the output only shows else part even if I enter correct user and password

提问人:user123 提问时间:2/1/2023 最后编辑:Vlad from Moscowuser123 更新时间:2/1/2023 访问量:101

问:

#include<stdio.h>
int main(){
    char user = "welcome";
    printf("Enter UserName \n");
    scanf("%s",&user);

    char pass = "hi";
    printf("Enter Password: \n");
    scanf("%s",&pass);

    if(user=="welcome" && pass == "hi"){
            printf("Login Successful");
    }
    else{
        printf("Retry");
    }
    return 0;
}

该程序要求输入用户名和密码,然后检查输入是否正确并打印合适的语句。

但是,对我来说,即使输入的数据正确,它也只显示其他部分。

在此处输入图像描述

c if-statement char 警告 声明

评论

0赞 Vlad from Moscow 2/1/2023
此声明 char user = “welcome”;不正确。至少你需要写 char *user = “welcome”;或者考虑到以下代码,您需要声明一个字符数组。
0赞 Weather Vane 2/1/2023
更正后,由于两个原因,将失败:a) 您不能修改字符串文字,b) 不是字符串的地址,而是指针的地址。scanf("%s",&user);&user
0赞 Jonathan Leffler 2/1/2023
该代码不应该(不会)在没有警告的情况下编译 - 因为您正在尝试将指向字符串的指针分配给单个 .在代码中将编译器警告视为错误报告——除非问题严重,否则编译器不会屈尊报告问题。如果您使用 GCC(或 Clang),请考虑使用 ,如果编译器发现任何需要警告的内容,编译将失败。如果您愿意,您可以添加更多、更挑剔的选项(例如)。char-Wall -Wextra -Werror-Wmissing-prototypes -Wstrict-prototypes -Wold-style-declaration -Wold-style-definition
0赞 Jonathan Leffler 2/1/2023
问题的另一部分:如何在 C 中正确比较字符串?

答:

1赞 Oreoezi 2/1/2023 #1

声明用户名和密码字段,如下所示:

char user[1024], pass[1024];

目前,它们只能容纳一个字符。您可以将 1024 更改为您假定用户将输入的最大字符数。您还应该记住,字符串不能与 !请改用里面的函数。user=="welcome"strcmpstring.h

评论

2赞 ryyker 2/1/2023
这些是声明,但都未初始化。初始化可以采用多种形式,例如 或...char user[1024] = {0}, pass[1024] = {0};char user[1024] = "welcome", pass[1024] = "hi";
1赞 Oreoezi 2/1/2023
@ryyker是的,我不好混淆这些术语。@Haris你误会了。我所说的“当前”是指 OP 尝试执行的当前代码 ()。char user = "welcome";
0赞 Harith 2/1/2023
@Oreoezi我收回了我的话。:)
1赞 ryyker 2/1/2023
如有必要,我们鼓励您编辑您的帖子,以便在发现问题时发表评论。这通常会改善您的答案。
3赞 Vlad from Moscow 2/1/2023 #2

该程序是完全错误的。

在这些声明中

char user = "welcome";

char pass = "hi";

您声明了您尝试通过该类型的表达式初始化的类型的对象(用作初始值设定项的字符串文本将隐式转换为指向其第一个元素的指针)。charchar *

相反,您需要声明字符数组,您将在其中读取用户名和他的密码。

例如

char user[10];
char pass[10];

的调用可以如下所示scanf

scanf("%9s", user);
scanf("%9s", pass);

在此 if 语句中

if(user=="welcome" && pass == "hi"){

您正在比较指针。相反,您需要比较像这样的字符串

if( strcmp( user, "welcome" ) == 0 && strcmp( pass, "hi" ) == 0 ){

要使用该函数,您需要包含标头strcmp<string.h>

#include <string.h>