C中的多行输入

时间:2015-01-10 14:51:24

标签: c line stdin

我必须为我的项目做以下事情 例如,给出诸如

之类的输入
9 3 2 5
6 3 4 6 1
9 5 0 4 3 1

我需要做以下事情

i)根据每一行(例如

)将输入分成不同的集合
set1={9,3,2,5)
set2={6,3,4,6,1}
set3={9,5,0,4,3,1}

ii)我还需要每组中的各个元素(例如第1组中的9,3,2,5)作为进一步处理的整数

注意:我不允许在单独的文件中输入输入,所以我尝试输入as “9 3 2 5 \ n6 3 4 6 1 \ n9 5 0 4 3 1”按下每行之后的输入将不会执行,因为我需要一次性完全输入

此外,我只需要使用C

任何实现上述目标的想法都将受到赞赏 谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用fgets()来读取行,然后strtok()来解析每一行,这是一个示例程序,我使用整数数组的第一个元素作为数组计数,所以你不需要将它存储在一个单独的变量中,我这样做是因为我假设你可以有不同长度的数组。

int freeArray(int **array, int setCount)
{
    if (array == NULL)
        return 0;
    while (setCount > 0)
        free(array[--setCount]);
    free(array);

    return -1;
}

void printArray(int *const *const array, int setCount)
{
    int i;
    for (i = 0 ; i < setCount ; ++i)
    {
        const int *pointer;
        int        j;

        pointer = array[i];
        if (pointer == NULL)
            continue;
        for (j = 1 ; j <= pointer[0] ; j++)
            printf("%d ", pointer[j]);
        printf("\n");
    }
}

int *parseLine(char *line, int setCount)
{
    char *pointer;
    int   count;
    char *token;
    int  *array;

    while ((*line != '\0') && (isspace(*line) != 0))
        line++;
    if (*line == '\0')
        return NULL;

    array   = NULL;
    pointer = line;
    count   = 0;

    while ((token = strtok(pointer, " ")) != NULL)
    {
        char *endptr;
        void *tmp;

        pointer  = NULL;
        tmp = realloc(array, (1 + ++count) * sizeof(int));
        if (tmp == NULL)
        {
            free(array);
            return NULL;
        }
        array        = tmp;
        array[0]     = count;
        array[count] = strtol(token, &endptr, 10);

        if ((*endptr != '\0') && ((*endptr != '\n')))
            fprintf(stderr, "error: the %dth %s: value of the %dth line, is not an integer\n",
                                                                count, token, setCount);
    }
    return array;
}

int main(int argc, char **argv)
{
    char  line[256];
    int **array;
    int   setCount;

    line[0]  = '\0';
    array    = NULL;
    setCount = 0;
    while (line[0] != '\n')
    {
        void *tmp;

        if (fgets(line, sizeof(line), stdin) == NULL)
            return -1;

        tmp = realloc(array, (1 + setCount) * sizeof(int *));
        if (tmp == NULL)
            return freeArray(array, setCount);

        array           = tmp;
        array[setCount] = parseLine(line, setCount);
        if (array[setCount] != NULL)
            setCount += 1;
    }
    printArray(array, setCount);
    freeArray(array, setCount);

    return 0;
}

最后,我将向您展示如何通过打印来访问数组数组的元素,以及如何free malloc内存。

当您按Enter键时此程序将退出,但如果您在按Enter键之前键入空格,则会出现问题,我会让您考虑解决此问题。