【问题标题】:Strcmp doesn't work on same strings with same lengthstrcmp 不适用于具有相同长度的相同字符串
【发布时间】:2019-12-04 23:42:50
【问题描述】:

所以,我有这个代码,其中密码是一个字符串,通过将标记分解为一个更大的字符串,并从文本文件中获得传递。我什至使用了 strcspn,所以我可以从 pass 中删除 '\n'。

    if (ok == 1){

        char buffer[20];
        snprintf(buffer, sizeof(buffer), "%s.txt", username);

        chdir("./passwords") ;

        FILE *userf;
        userf = fopen(buffer,"r");
        if(userf == NULL){
            perror("Eroare la fopen");
            exit(1);
        } else
            printf("Am deschis fisierul cu parola\n");

        char pass[20];

        if(fgets(pass, sizeof(pass), userf) == NULL){

            perror("Eroare la fgets");
            exit(1);
        } 
        pass [ strcspn(pass, "\r\n") ] = '\0'; 
        printf("%s\n%s\n",password, pass);
        printf("%i %i\n",strlen(password), strlen(pass));

        if(strcmp(password, pass) == 0){
            printf("Connected");
        }
    }

从终端可以看到,它打印出相同长度的相同字符串,但 strcmp 出于某种原因没有返回 0。我真的很困惑。

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?文件的相关内容是什么(如果它被正确读取,只需省略它并对内容进行硬编码)?我希望能够运行它并查看问题。此外,最好将输出显示为文本而不是屏幕截图。谢谢。
  • 您确定从文件中读取的通行证末尾包含“\r”或“\n”吗?如果不是,并且传递长度为 20,您将在缓冲区边界上写入尾随 '\0'。

标签: c fgets strcmp


【解决方案1】:

如果您将\n 添加到最后一个printf,您会发现它可以正常工作。

您的程序在刷新标准输出缓冲区之前刚刚退出。

【讨论】:

    【解决方案2】:

    你怎么知道它没有正确比较?如果是打印的语句,您似乎忘记了换行符,这意味着如果没有另一个打印,它可能不会被刷新到屏幕上。

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多