чтение неизвестного количества целых чисел от stdin (C)

Я должен считать входной файл как:

1
19 20 41 23
2
41 52 43
3
90 91 941
4
512
5

6
51 61

Каждая нечетная строка является целым числом. Каждая ровная строка является неизвестным количеством целых чисел.

Это очень легко в C++

while( cin >> k ){
............
}

Я не так привык к C, таким образом, я не мог сделать его в C. Какие-либо способы сделать это?

7
задан Telemachus 4 July 2014 в 00:55
поделиться

5 ответов

Способ Я бы сделал это, чтобы разбить его на две операции: прочитать строку, затем прочитать целые числа в этой строке. Вот ленивая реализация с использованием стандартной библиотеки C:

char line[1024], *p, *e;
long v;
while (fgets(line, sizeof(line), stdin)) {
    p = line;
    for (p = line; ; p = e) {
        v = strtol(p, &e, 10);
        if (p == e)
            break;
        // process v here
    }
}
9
ответ дан 6 December 2019 в 06:50
поделиться

Прогон входного файла через:

#include <stdio.h>

int main() {
        int k;
        while (scanf("%d", &k) == 1) {
                printf("read number: %d\n", k);
        }
        return 0;
}

Результат:

read number: 1
read number: 19
read number: 20
read number: 41
read number: 23
read number: 2
read number: 41
read number: 52
read number: 43
read number: 3
read number: 90
read number: 91
read number: 941
read number: 4
read number: 512
read number: 5
read number: 6
read number: 51
read number: 61

Это С-аналог кода, на который вы ссылаетесь в исходном вопросе.

12
ответ дан 6 December 2019 в 06:50
поделиться

Я бы сделал одну из:

  • fgetc(), чтобы прочитать отдельные символы и разобрать их самостоятельно (накапливать цифры до тех пор, пока вы не нажмете на пробел и не получите целое число для преобразования с помощью atoi(); если пробел - это новая строка, то она завершает список целых чисел)

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

1
ответ дан 6 December 2019 в 06:50
поделиться

Удаление и добавление с историей является ожидаемым событием при переименовании файла в Subversion. История не потеряна.

StartSvn и AnkhSvn фиксируют события из Visual Studio о переименовании файла и делают правильные действия.

-121--2758783-

Вы можете использовать пакет setspace , который предоставляет среды интервалов, например:

\documentclass{article}
\usepackage{setspace}
\begin{document}
\doublespace
my line of text blah blah blah

new line of text with blank line between
\end{document}

или использовать среду verbatim для точного управления макетом кода.

-121--1003007-

посмотрите на getc (3) или scanf (3)

0
ответ дан 6 December 2019 в 06:50
поделиться

Как указано на gitignore man page :

Файл gitignore указывает на преднамеренно не отслеживаемые файлы, которые git должен игнорировать

Если glucosia.xcodeproj/project.pbxproj (как предлагает Алан в комментариях)

git rm --cached glucosia.xcodeproj/project.pbxproj

Если файл уже зафиксирован, см. этот ответ SO ( git commit --amend , чтобы удалить его из последней фиксации)

-121--1906136-

Установите для dataType значение «JSONP» при вызове $ .ajax () . Вы должны убедиться, что ответ правильно отформатирован, чтобы он работал. Википедия имеет хороший раздел на JSONP .

-121--4244654-

Я бы разбил программу в разных задачах.

Первый шаг состоит в том, чтобы иметь возможность считывать пару строк, первую строку, которая сообщает вам количество считываемых чисел, а затем вторую строку, чтобы считывать фактические числа. Для этого может быть полезна функция, называемая чем-то вроде read _ set . Он должен иметь возможность возвращать считанные числа и сигнальный конец файла, а также ошибки. Для этого мы можем определить структуру данных, такую как:

struct numbers {
    long *data; /* or choose a type depending upon your needs */
    size_t len;
};

, а затем мы можем объявить нашу функцию с прототипом:

int read_set(FILE *fp, struct numbers *num);

Функция выделит память для num- > data , и установить num- > len в правильное значение. Он возвращает 0 за успех и набор условий ошибки в противном случае. Мы можем получить фантазии и использовать enum для возврата статусов позже. Пока допустим, что 0 = успех, 1 = конец файла, а все остальное - ошибка.

Затем вызывающий абонент вызывает read _ набор () в цикле:

struct numbers numbers;
int status;
while ((status = read_set(fp, &numbers)) == 0) {
    /* process numbers->data, and then free it */
}
if (status == 1) {
    /* hit end of file, everything is OK */
} else {
    /* handle error */
}

Для реализации read _ набор () он должен считывать две строки. Существует множество реализаций чтения полной строки в C , поэтому можно использовать любую из них, и сначала прочитать строку, затем sscanf () / strtoul () для одного числа (проверьте его возвращаемое значение!). После получения номера n можно прочитать следующую строку в памяти и сделать следующее:

num->data = malloc(n * sizeof *num->data);
num->len = n;

Затем можно повторно вызвать sscanf () или strtol () для сохранения номеров в num- > data . Необходимо поставить чеки, чтобы убедиться, что в этой строке точно n чисел.

Обратите внимание, что можно записать read _ набор () другими способами: считывать строки по символам и анализировать числа по мере их чтения. Это имеет преимущество, заключающееся в том, что данные переходят только один раз и не нуждаются в большом буфере для хранения всей входной линии в памяти, но недостаток состоит в том, что они сами выполняют низкоуровневые операции, и чтение данных по символам может быть медленным.

3
ответ дан 6 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: