Функция Scanf останавливается после новой строки и читает только небольшую часть ввода (следует игнорировать новую строку и вкладки) - PullRequest
0 голосов
/ 02 марта 2019

Весь вопрос в короткой версии:

Я хочу загрузить этот ввод

4
     CAAC

      28    EAAEB5
  F489AD95

, но все, что я могу получить от него:

4                                                                                                                                                                                           

Я пытаюсь сделать из этого ввода следующие параметры: 4 CAAC 28 EAAEB5 F489AD95

--------------- Подробное объяснение с моим кодом ---------------------------

Я новичок в языке C, и япытаясь сделать ввод, чтобы быть в виде строки и работать с ней после ... У меня есть проблема для обработки "Whitespaces", таких как ["\n", "\t" и " "] Вот ввод, который я дална мой компилятор:

4
     CAAC

      28    EAAEB5
  F489AD95

есть куча пробелов, табуляции и т. д. Я хочу сделать, это прочитать его и заменить \ n и \ t (в полноте ниже я пытаюсь игнорировать это, потому что сразу после того, как scanf () находит \ n, он пропускает остальную часть.

Это один из кодов, которые я пробовал сейчас:

#include <stdio.h>

int main()
{
    int number;
    char chr[200];

    // %d -> I know that there should be number at the beginning, so until character / space appears, I want to read the number.
    // scanf("%d", &number);

    // ignores \n and \t and then puts it in chr
    scanf(" %[^\t\n]s", &chr);

    // last should be \n so this is just acheck if there is ( its gonna be in if later )
    scanf("%c");

    printf("\n %s", chr);
    printf("\n Heythere");

    return 0;
}

Это вывод, который у меня естьполучил:

4                                                                                                                                                                                           
 Heythere 

Я думал о том, чтобы поставить его в цикл, но проблема в том, что последний чаracter равен "\ n", и он может появляться несколько раз в данной строке.

В настоящее время я пытаюсь найти лучший вариант для scanf () для чтения этих строк и игнорирования новых строк

/////////

Другими словами:

Я пытаюсь сделать из этого ввода следующие параметры: 4 CAAC 28 EAAEB5 F489AD95

Есть идеи, как это исправить, чтобы иметь возможность полностью его буферизовать?(также лучшим ответом, который мне поможет, будет тот, который заменит эти "\ n" и "\ t" одним "" (пробел). Заранее спасибо за ваши ответы (также извините, если это действительно простои отвечай, как миллион раз ... Я застрял здесь на неделю)

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

У вас есть несколько вариантов:

  • Использовать официальную ветку обсуждения в IS
  • Спросите любого из консультантов во время их работы
  • В качестве альтернативыПопросите их в другой раз, если вы не можете прийти
  • Написать письмо любому из консультантов

Мои чувства к этому посту

0 голосов
/ 02 марта 2019

На первый взгляд, все, что вам нужно, это цикл для чтения пяти строк:

char data[5][100];
int i;

for (i = 0; i < 5; i++)
{
    if (scanf("%99s", data[i]) != 1)
    {
        fprintf(stderr, "Unexpected input failure (i = %d)\n", i);
        exit(EXIT_FAILURE);
    }
}

Теперь элементы массива будут содержать 5 строк («слов»), которые вы указали.

По своей конструкции функции scanf() в основном игнорируют пробелы, за исключением случаев, когда они разделяют строки или числа.Все, кроме трех, спецификаторы преобразования пропускают первый пробел - исключение составляют %c, %[…] (наборы сканирования) и %n.

Спецификация преобразования %99s пропускает первый пробел (пробелы, табуляции, новые строки), потребляет до 99 символов, которые не являются пробелами, и останавливается на первом пробеле (или когда строка заполнена), оставляя пробел во входном потоке для обработки следующим вводомесли строка не была полной.

Очевидно, вам придется работать немного усерднее, если вы не знаете, что нужно прочитать пять строк - но основная идея та же.

Если вы хотите сохранить или изменить переводы строк, табуляции, пробелов, scanf() не является подходящим инструментом для работы.Это не заботится о пустом пространстве, и вы делаете - это не приведет к счастью.Затем вы используете fgets() или POSIX getline(), чтобы прочитать строки ввода, и вы можете обрабатывать пробелы, табуляции и новые строки по своему усмотрению.

...