警告:[-Wformat=]和strcmp()未在C中进行比较
我正在用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
#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
achar**
而不是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);