fgets не принимает ввод двух строк - PullRequest
0 голосов
/ 12 апреля 2020

Я решил вопрос, но все еще сомневаюсь Вот мой код:

#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); Но кто-то может сказать мне, что именно он делает? Я не знаю, почему это работает!

1 Ответ

0 голосов
/ 12 апреля 2020

fgets прекращает чтение после ввода, когда видит новую строку (которая не используется, если в буфере недостаточно места). Таким образом, новая строка из первого ввода остается во входном потоке, который второй вызов fgets видит и прекращает чтение ввода.

Когда вы добавляете getc(stdin);, он потребляет остаток символа новой строки, поэтому он работает.

Как отмечено в комментариях, вы выделяете только n байт для a, но пытаетесь читать до n + 1 байтов. Это неопределенное поведение. Поэтому вам нужно добавить «+ 1» к вызову mallo c (как вы делаете для распределения b).

Другая проблема, о которой вам нужно знать, это fgets будет также читать символ новой строки в a и b, если у них достаточно места (например, вы вводите просто "hi" и n равно 10).

И еще одна проблема заключается в том, что если заданное значение меньше n, вы oop все равно сравниваете n символов. Это может быть неопределенным, так как остальные буферы неинициализированы.

Вы также можете break из l oop сразу, когда есть несоответствие. Не нужно сравнивать остальные символы.

...