C中的多行输入

multiple line inputs in C

我必须为我的项目做以下事情 例如给定输入

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)作为整数进行进一步处理

注意:我不允许在单独的文件中输入,所以我尝试输入为 “9 3 2 5\n6 3 4 6 1\n9 5 0 4 3 1”因为在每一行之后按回车键是行不通的,因为我需要一次性给出完整的输入

此外,我只需要使用 C

任何实现上述内容的想法将不胜感激 谢谢您的帮助。

你可以使用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 != '[=10=]') && (isspace(*line) != 0))
        line++;
    if (*line == '[=10=]')
        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 != '[=10=]') && ((*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]  = '[=10=]';
    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 malloced 内存。

这个程序按回车就退出了,但是如果你在回车前输入一个space,就会出问题,我让你想办法解决。