将stdin的输入存储到列表中

时间:2015-03-20 14:25:36

标签: c list input struct stdin

我将以下列格式获取输入,我希望将其存储到arraylist或甚至链接列表中(无论哪个更容易实现):

3,5;6,7;8,9;11,4;

我希望能够将;之前的两个数字放入结构中并存储它们。例如,我希望将3,5组合在一起,将6,7组合在一起。

我不确定如何读取输入并获取每对并存储它。我将获得的输入可能相当大(高达60-70mB)。

我尝试使用strtok()strtol(),但我似乎无法正确实施。

任何帮助都会很棒

编辑:

我现在尝试做的是使用这段代码来阅读输入:

char[1000] remainder;
int first, second;
fp = fopen("C:\\file.txt", "r"); // Error check this, probably.
while (fgets(&remainder, 1000, fp) != null) { // Get a line.
    while (sscanf(remainder, "%d,%d;%s", first, second, remainder) != null) {
        // place first and second into a struct or something
    }
}

我修复了代码中的语法错误,但是当我尝试编译时,它崩溃了。

1 个答案:

答案 0 :(得分:0)

通过添加单行,相同的答案为您的问题提供了强大而灵活的解决方案。花点时间了解它的作用。它并不复杂,它只是基本的C.为了让您从string转换为int,您有2个选择 libc ,{ {1}}(无错误检查)和atoi(错误检查)。您唯一的另一种选择是手动编码转换,在这个问题的两个版本中给出您的评论,这不是您想要的。

以下是一个很好的解决方案。花点时间了解它的作用。无论您使用strtol还是fgets,问题的解决方法都是一样的。让我知道你的问题是什么:

getline

<强>输出

/* read unliminted number of int values into array from stdin
(semicolon or comma separated values, pair every 2 values)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define NMAX 256

int main () {

    char *ln = NULL;                /* NULL forces getline to allocate  */
    size_t n = 0;                   /* max chars to read (0 - no limit) */
    ssize_t nchr = 0;               /* number of chars actually read    */
    int *numbers = NULL;            /* array to hold numbers            */
    size_t nmax = NMAX;             /* check for reallocation           */
    size_t idx = 0;                 /* numbers array index              */

    if (!(numbers = calloc (NMAX, sizeof *numbers))) {
        fprintf (stderr, "error: memory allocation failed.");
        return 1;
    }

    /* read each line from stdin - dynamicallly allocated   */
    while ((nchr = getline (&ln, &n, stdin)) != -1)
    {
        char *p = ln;       /* pointer for use with strtol  */
        char *ep = NULL;

        errno = 0;
        while (errno == 0)
        {
            /* parse/convert each number on stdin   */
            numbers[idx] = strtol (p, &ep, 10);
            /* note: overflow/underflow checks omitted */
            /* if valid conversion to number */
            if (errno == 0 && p != ep)
            {
                idx++;              /* increment index      */
                if (!ep) break;     /* check for end of str */
            }

            /* skip delimiters/move pointer to next digit   */
            while (*ep && (*ep <= '0' || *ep >= '9')) ep++;
            if (*ep)
                p = ep;
            else
                break;

            /* reallocate numbers if idx = nmax */
            if (idx == nmax)
            {
                int *tmp = realloc (numbers, 2 * nmax * sizeof *numbers);
                if (!tmp) {
                    fprintf (stderr, "Error: struct reallocation failure.\n");
                    exit (EXIT_FAILURE);
                }
                numbers = tmp;
                memset (numbers + nmax, 0, nmax * sizeof *numbers);
                nmax *= 2;
            }
        }
    }

    /* free mem allocated by getline */
    if (ln) free (ln);

    /* show values stored in array   */
    size_t i = 0;
    for (i = 0; i < idx; i++)
        if ( i % 2 == 1 )       /* pair ever 2 values */
            printf (" numbers[%2zu] numbers[%2zu]  %d, %d\n", i-1, i, numbers[i-1], numbers[i]);

    /* free mem allocated to numbers  */
    if (numbers) free (numbers);

    return 0;
}