Почему scanf не позволяет вводить больше ввода?

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

int main() {
    char a[100], b[100];
    char *ret;
    scanf("%[^\n]s", a);
    scanf("%[^\n]s", b);
    ret = strstr(a, b);
    if (ret != NULL)
        printf("its a substring");
    else
        printf("not a substring");
    return 0;
}

Моя цель состояла в том, чтобы проверить, присутствует ли подстрока в родительской строке в строке или нет. Я узнал о strstr() функции здесь.

Ранее я использовал %[^\n]s в моих кодах, и они хорошо работали. Но в этом случае, как только я нажимаю return/enter после ввода одной строки, вывод not a substring.

Что я делаю неправильно?

Ответ 1

Первый вызов scanf() останавливается, когда видит новую строку ('\n'), но все еще находится во входном потоке. Таким образом, второй вызов прерывается немедленно, поскольку он видит (тот же) символ новой строки.

Вы всегда должны проверить возвращаемое значение scanf() для отказа.

Вы можете вставить вызов getchar(); между вызовами scanf() для использования символа новой строки. Или лучше используйте fgets() и обработайте символ новой строки.


Вот как вы могли бы использовать fgets() в своем коде:

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

int main(void) {
     char a[100], b[100];
     char *ret;
     if (fgets(a, sizeof a, stdin) == NULL) {
        /* error handling */
     }

     a[strcspn(a, "\n")] = '\0';
     if (fgets(b, sizeof b, stdin) == NULL) {
       /* error handling */
     }

     b[strcspn(b, "\n")] = '\0';
     ret=strstr(a, b);
     if(ret!=NULL)
         printf("its a substring");
     else
         printf("not a substring");
     return 0; 
}

Ответ 2

Формат scanf(), который вы используете %[^\n], не имеет завершающего s, и вы должны указать максимальное количество символов для хранения в целевом массиве. Поскольку массив имеет размер 100, вы должны указать %99[^\n].

Кроме того, вы должны пропустить новую строку между 2 %99[^\n], иначе второе преобразование завершится неудачно, так как в противном случае символы не будут отличаться от \n.

Вот простая коррекция с использованием scanf(). У usr есть хорошая альтернатива, используя fgets(), который является более простым способом анализа данных:

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

int main(void) {
    char a[100], b[100], c;

    if (scanf("%99[^\n]%c%99[^\n]", a, &c, b) == 3 && c == '\n') {
        if (strstr(a, b))
            printf("its a substring\n");
        else
            printf("not a substring\n");
    }
    return 0;
}