在循环中比较C中的两个字符串
我正在编写一个代码,以查看用户的输入是否等同于已声明的字符串。程序使用strcmp函数循环,直到输入与字符串相同,但由于某些原因,程序不比较字符串,因此循环出现故障。代码如下:在循环中比较C中的两个字符串,c,string,while-loop,C,String,While Loop,我正在编写一个代码,以查看用户的输入是否等同于已声明的字符串。程序使用strcmp函数循环,直到输入与字符串相同,但由于某些原因,程序不比较字符串,因此循环出现故障。代码如下: int main() { char passcode[3]="ZZZ"; char input[3]; int check; while(check!=0) { printf("What is the password?\n"); gets(
int main()
{
char passcode[3]="ZZZ";
char input[3];
int check;
while(check!=0)
{
printf("What is the password?\n");
gets(input);
check=strcmp(passcode, input);
}
printf("You crack the pass code!");
return 0;
}
主要问题是:
char passcode[3]="ZZZ";
char input[3];
C中的字符串由一系列字符和一个空字节组成passcode
不够大,无法容纳初始化字符串的空字节。因此,当您试图通过将其传递到strcmpstrcmp
来将其用作字符串时,它将读取数组的末尾。这样做会激发我们的兴趣
类似地,input
不够大,无法容纳足够大的字符串进行比较
您也没有初始化检查
,因此第一次进入循环时它的值未知
另一个问题是使用get
。此函数很危险,因为它不检查用户输入的字符串是否可以放入给定的缓冲区。如果is太大,则再次调用未定义的行为
使数组变大以容纳用户的输入和目标字符串,并使用fgets
而不是gets
。您还应该将while
循环更改为do..while
,因为您至少需要进入一次循环
#include <stdio.h>
int main()
{
char passcode[]="ZZZ"; // array is automatically sized
char input[50];
int check;
do {
printf("What is the password?\n");
fgets(input, sizeof(input), stdin);
check=strcmp(passcode, input);
} while (check!=0);
printf("You crack the pass code!");
return 0;
}
#包括
int main()
{
字符密码[]=“ZZZ”;//数组自动调整大小
字符输入[50];
整数检查;
做{
printf(“密码是什么?\n”);
fgets(输入,sizeof(输入),标准输入);
检查=strcmp(密码,输入);
}while(检查!=0);
printf(“你破解了密码!”);
返回0;
}
我知道发生了什么。您的输入字符串只有三个字节,您正在使用不安全的GET进行读取。gets按预期将ZZZ的输入放入输入变量,但将终止null放入密码的第一个字节
将输入缓冲区的大小更改为999,效果会更好。上面建议的代码无法识别输入。它可能无法工作,并且将卡在while循环中。我建议使用scanf进行输入,然后像使用strcmp那样比较字符串。如果输入是正确的,则允许输入并中断while循环。试试这个:
#include <stdio.h>
int main()
{
char input[3];
printf ("\nHit the pass code!\npass code: ");
while (input != "ZZZ") {
scanf ("%s",&input);
if (strcmp(input, "ZZZ") == 0){
printf ("\nYou crack the pass code!!\n\n");
break;
} else {
printf ("Wroooong!\n pass code: ");
}
}
return 0;
}
#包括
int main()
{
字符输入[3];
printf(“\n输入密码!\n密码:”;
while(输入!=“ZZZ”){
scanf(“%s”,&input);
如果(strcmp(输入,“ZZZ”)==0){
printf(“\n您破解了密码!!\n\n”);
打破
}否则{
printf(“wrooong!\n密码:);
}
}
返回0;
}
您应该使用一些非零值初始化检查。strcmp(密码,输入)
需要两个字符串passcode[]
不是字符串,因为它缺少空字符。[gets()
太危险了,不能使用-永远!]。您只能安全地键入2个字符-这太少了,远远不能保证远程安全。将3更改为4096。使用Post输入、查看输出和预期输出。当我使用1初始化check时,它开始工作,并将数组大小更改为4096,但gets(),似乎工作,而scanf不工作,我不太明白4096为什么工作?我更喜欢你的答案。您不仅告诉了他们出了什么问题,还告诉了他们如何解决问题以及如何避免将来出现问题。可能对OP不起作用,因为input[]
肯定包含'\n'
。也许可以添加密码[strcspn(passcose,“\n”]=”\0“;
?