程序不接受第二个字符串并直接给出输出

Program is not accepting second string and giving output directly

这里我想比较case2中的两个字符串。 case 1 效果很好,但是当我转到 case 2 时,它不要求输入第二个字符串并直接打印“两个字符串都不同”[1] [1]: https://i.stack.imgur.com/l2J6L.jpg

#include <stdio.h>
#include <stdlib.h>
#define size 20

int main ()
{
    char str1[size],str2[size];
    int operation,error=0,i=0;
    printf("Enter String: ");
    fgets(str1, size, stdin);
    do {
        printf("1.Copy\n2.Compare\n3.Exit\nWhich operation you want to do:");
        scanf("%d",&operation);
        switch (operation) {
            case 1:
                for (int i=0; str1[i] != '[=10=]'; i++) {
                    str2[i] = str1[i];
                }
                printf("First string: %s\n",str1);
                printf("Second string: %s\n",str2);
                break;
            
            default:
                printf("Error");
                break;
        
            case 2:
                printf("Enter second string: ");      // it's not executing (Not takin input) and directly i get o/p of line 39
                fgets(str2, size, stdin);
                for (i=0; str2[i] != '[=10=]'; i++) {
                    if (str1[i] != str2[i]) {
                        error++;
                    }
                }
                if (error == 0) {
                    printf("Both strings are same.\n");
                }
                else
                    printf("Both strings are not same.\n");
                break;
        }
    

    } while (operation != 3);
}

由于 scanf 留下悬垂的换行符 \n 导致 fgets 不等待用户的输入。尝试使用 getchar.

刷新输入缓冲区

更新: 添加了循环以删除所有被 scanf 跳过但可以由用户输入的字符,例如数字后的额外空格。

...
do {
        printf("1.Copy\n2.Compare\n3.Exit\nWhich operation you want to do:");
        scanf("%d",&operation);
        int ch;
        while ((ch = getchar()) != '\n' && ch != EOF);
        switch (operation) {
...

参考:faq.cprogramming.com

因为你的字符串是行,scanf() 不是一个好的选择,除了获取整数值,然后清除缓冲区中的所有内容(可能是各种垃圾,永远不要相信用户),做a fgets 进入 str2。如果新行相同,它们也会进行比较。您还应该测试 scanf 中的 return 是否为 1,说明您得到了一个数字!如果用户输入 'x' 作为数字怎么办?如果你想再次询问,你需要清除缓冲区中的垃圾。请记住,由于您有 'cooked' 输入,因此在用户按下回车之前不会发送任何内容,因此您始终需要处理换行符。如果你所做的只是扫描数字,scanf 将通过一个新行作为白色 space 寻找数字,但你正在混合输入字符串和数字。

如果一个字符串是另一个字符串的前缀,则需要将 null 与 mis-compare 进行比较,因此在 'for' 中测试 'i < size' 但如果两个字符串都有在同一点 ( !str1[i] && !str2[i] ) 或第一次错误比较(设置错误)时为空。与第一个小姐相比没有意义!在前缀的情况下,空值 mis-compare 是其他一些字符值。

由于尾随的 space 是字符串的一部分,您可以用单引号打印它们(在删除新行之后)。