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
malloc
ed 内存。
这个程序按回车就退出了,但是如果你在回车前输入一个space,就会出问题,我让你想办法解决。
我必须为我的项目做以下事情 例如给定输入
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
malloc
ed 内存。
这个程序按回车就退出了,但是如果你在回车前输入一个space,就会出问题,我让你想办法解决。