首页 > 解决方案 > fgets 没有输入两个字符串

问题描述

我解决了这个问题,但仍有疑问这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argv, char *argc[])
{

    if (argv != 2)
    {
        printf("Invalid Input, Please enter the length of the strings you wish to compare\n");
        return 1;
    }
    int n = atoi(argc[1]);
    char *a = malloc((sizeof(char) * n));
    printf("Enter the first string - ");
    fgets(a, n + 1, stdin);
    getc(stdin);
    char *b = malloc((sizeof(char) * n) + 1);
    printf("Enter second string  - ");
    fgets(b, n + 1, stdin);
    int d = 0;
    for (int i = 0; i < n; i++)
    {
        if (*(a + i) != *(b + i))
        {
            d++;
        }
    }
    if (d == 0)
    {
        printf("The two strings are identical\n");
    }
    else
    {
        printf("The two strings are not identical\n");
    }
    free(a);
    free(b);
}

添加后我的问题得到了解决getc(stdin); 但是有人可以告诉我它到底在做什么吗?我不知道为什么它有效!

标签: cstringpointersfgets

解决方案


fgets一旦看到换行符,输入后停止读取(如果缓冲区没有足够的空间,则不会消耗)。所以第一个输入的换行符留在输入流中,第二次调用 fgets 看到并停止读取输入。

当您添加getc(stdin);时,它会消耗剩余的换行符,因此它可以工作。

如评论中所述,您仅分配n字节,a但尝试读取最多n + 1字节。这是未定义的行为。因此,您需要在 malloc 调用中添加“+ 1”(就像您为 分配所做的那样b)。

您需要注意的另一个问题是,如果换行符有足够的空间(例如,您只输入“hi”并且是 10),也会将换行符fgets读入。abn

另一个问题是,如果给定的输入小于n,则循环仍会比较n字符。这可能是未定义的,因为其余缓冲区未初始化。

break当出现不匹配时,您也可以立即退出循环。无需比较其余的字符。


推荐阅读