gpt4 book ai didi

c - 将来自 stdin 的输入存储到列表中

转载 作者:行者123 更新时间:2023-11-30 17:18:28 27 4
gpt4 key购买 nike

我将以以下格式获取输入,我希望将其存储到数组列表中,甚至可能是链接列表中(以更容易实现的方式为准):

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
}
}

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

最佳答案

通过添加一行,相同的答案可以为您的问题提供强大而灵活的解决方案。花点时间了解它的作用。它一点也不复杂,只是基本的 C 语言。为了让您进行从 stringint 的转换,您有 libc 提供的 2 个选择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;
}

输出

$ echo "3,5;6,7;8,9;11,4;;" | ./bin/parsestdin2
numbers[ 0] numbers[ 1] 3, 5
numbers[ 2] numbers[ 3] 6, 7
numbers[ 4] numbers[ 5] 8, 11

关于c - 将来自 stdin 的输入存储到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29168851/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com