我必须为我的项目做以下事情 例如,给出诸如
之类的输入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
任何实现上述目标的想法都将受到赞赏 谢谢您的帮助。
答案 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键之前键入空格,则会出现问题,我会让您考虑解决此问题。