Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
警告:[-Wformat=]和strcmp()未在C中进行比较_C - Fatal编程技术网

警告:[-Wformat=]和strcmp()未在C中进行比较

警告:[-Wformat=]和strcmp()未在C中进行比较,c,C,我正在用C语言编写一个简单的代码。老实说,我有很长一段时间没有在里面编程。所以我想做一个简单的程序,让自己重新熟悉这种编程语言 代码如下: #include <stdio.h> #include <string.h> int main() { char email; char temppass[64]; char pass[] = "password"; printf("Enter your email: \n"); scanf

我正在用C语言编写一个简单的代码。老实说,我有很长一段时间没有在里面编程。所以我想做一个简单的程序,让自己重新熟悉这种编程语言

代码如下:

#include <stdio.h>
#include <string.h>

int main()
{
    char email;
    char temppass[64];
    char pass[] = "password";

    printf("Enter your email: \n");
    scanf("%s", &email);

    printf("Enter your password: \n");
    scanf("%s" , &temppass);


    if(strcmp(temppass, pass) == 0){

        printf("This is the password");

    }


    else{

        printf("You Failed!");


    }

return 0;

}
#包括
#包括
int main()
{
字符电子邮件;
char-temppass[64];
char pass[]=“密码”;
printf(“输入您的电子邮件:\n”);
scanf(“%s”和电子邮件);
printf(“输入密码:\n”);
scanf(“%s”、&temppass);
如果(strcmp(temppass,pass)==0){
printf(“这是密码”);
}
否则{
printf(“你失败了!”);
}
返回0;
}
虽然我有一些我无法解决的问题。第一个问题是它给了我一个警告:

strcmp2.c:在函数“main”中:
strcp2.c:14:13:警告:格式“%s”要求参数的类型为“char*”,但参数2的类型为“char(*)[64]”[-Wformat=]
scanf(“%s”、&temppass);
~^~~~~~~~~~~

我很清楚这个问题看起来可能和其他问题一样重复,但就我搜索和阅读的所有问题和答案而言,没有一个能帮助我,因为它们是不同的,对我没有帮助

起初,我试图用
fgets()
作为输入函数来解决这个问题。编译代码时,它既没有给我警告也没有给我错误,但问题是
fgets
在输入的末尾放了一个
\n
新行字符。所以用户输入和我比较的字符串是不一样的。我尝试在
charpass[]=“password\n”
添加新行字符,以查看它是否解决了任何问题,但再次失败

但是,当我运行它并输入请求的信息时,
strcmp()
函数将无法成功比较这两个字符串,即使密码输入相同


如果有人能帮助我,我真的很感谢你和你宝贵的时间。非常感谢:)

email
变量是一个字符,您正在尝试向其中传递字符串


使其
电子邮件[50]stdin
读取字符串时,请在
scanf
中删除
&
,这就是触发警告的原因。

电子邮件
只能存储一个字符,不能存储字符串。当您给出数组的地址时,不需要scanf中的
&
temppass
&temppass[0]

请尝试以下方法:

char email[64];
char temppass[64];
char *pass = "password";

printf("Enter your email: \n");
scanf("%s", email);

printf("Enter your password: \n");
scanf("%s" , temppass);

请注意,如果输入的长度大于字符串的长度,则读取字符串的方式是不安全的。

编译器正在抱怨,因为
&temppass
的类型如它所说是指向字符数组的指针;使用
scanf
“%s”
说明符需要指向char的指针。容易修复。改变

scanf("%s" , &temppass);


也就是说,删除
&

密码测试不起作用的原因与警告有关。当temppass声明为数组时,它实际上是指向静态分配内存的指针。因此,当您获取它的地址时,您不再指向数组的开头,而是指向一个值指向数组开头的变量。情况与此代码类似:

char*c=malloc(42);
scanf(“%s”、&c);
如您所见,我们提供的是
scanf
a
char**
而不是
char*

正如其他人所指出的,
email
变量可能也应该是一个数组,对
scanf
的调用也不应该在该点上获取电子邮件地址


此外,最好显式初始化变量并绑定输入。对于前者,如果您在编译时没有进行优化,那么编译器可能已经在清空内存,但是当您进入生产代码时,未初始化的变量是危险的。类似地,由于输入被放置到静态分配的数组中,因此应告知scanf限制其复制的字符数

#包括
#包括
int main()
{
char email[64]={0};
char temppass[64]={0};
char pass[]=“密码”;
printf(“输入您的电子邮件:\n”);
int scanf_return_value=scanf(“%63s”,电子邮件);
如果(扫描返回值!=1){
printf(“分析输入时出错!\n”);
如果(扫描返回值==EOF){
佩罗(“scanf”);
}否则{
printf(“scanf返回意外值%d”,scanf\u返回值);
}
}
printf(“输入密码:\n”);
scanf_return_value=scanf(“%63s”,temppass);
如果(扫描返回值!=1){
printf(“分析输入时出错!\n”);
如果(扫描返回值==EOF){
佩罗(“scanf”);
}否则{
printf(“scanf返回意外值%d”,scanf\u返回值);
}
}
如果(strcmp(temppass,pass)==0){
printf(“这是密码”);
}
否则{
printf(“你失败了!”);
}
返回0;
}

NMDV,但
scanf(“%s”,电子邮件)
类似于
gets()
(这很糟糕),两者都没有缓冲区限制<代码>字符电子邮件[64];scanf(“%63s”,电子邮件)更好。
scanf(“%s”,temppass)不允许密码中有空格。考虑放弃所有的代码>代码> SCAFF()/代码>,使用<代码> FGETSH()/代码>不同于<代码> FGES <代码> SCANF的长度限制排除了字符串终止符,因此这里应该是“代码> %63S ”,而且检查SCANF函数族的返回值也是很重要的,在您的示例中,它必须是
1
@saffronsnail,感谢您的回答和演讲。正如我在一开始所说的,我有太多的时间用其他编程语言编程,我开始忘记C。我编辑了代码,现在它工作得很好:D:)“最好显式初始化变量并绑定
scanf("%s" , temppass);