在循环中比较C中的两个字符串

在循环中比较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(

我正在编写一个代码,以查看用户的输入是否等同于已声明的字符串。程序使用strcmp函数循环,直到输入与字符串相同,但由于某些原因,程序不比较字符串,因此循环出现故障。代码如下:

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
不够大,无法容纳初始化字符串的空字节。因此,当您试图通过将其传递到strcmp
strcmp
来将其用作字符串时,它将读取数组的末尾。这样做会激发我们的兴趣

类似地,
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“;