可变长度字符串到int数组?

发布于 12-11 08:17 字数 221 浏览 0 评论 0原文

我有一个形式为的字符串 “1 2 8 4 9 0”等。我知道它将遵循整数,空格,整数的格式......

但是,我不能保证长度。我知道最大长度,如果有帮助的话。 我想使用 sscanf,但它需要有限数量的整数。

有什么想法可以将“1 2 3 ”转换为一个数组,其中

A[0] = 1

A[1] = 2

A[2] = 3

谢谢!

I have a string which is in the form
"1 2 8 4 9 0 " etc. I know it will follow the format of integer, space, integer...

However, I can't guarentee the length. I know the maximum length, if that helps.
I thought to use sscanf, but it needs a finite number of integers.

Any ideas how I can turn "1 2 3 " into an array where

A[0] = 1

A[1] = 2

A[2] = 3

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

树深时见影2024-12-18 08:17:19

strtol 指示字符串中失败的位置.
对于像 "1 2 3 ..." 这样的字符串,它将读取 1 并随后失败;如果您随后将该故障点 (" 2 3 ...") 传递给 strtol ,它将读取 2 并随后失败,.. ., ...

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  char input[] = "6 82 -7453 4 0 63 ";
  char *err = " ", *curr = input;
  int x, k = 0;
  while (*curr && isspace((unsigned char)*err)) {
    x = strtol(curr, &err, 10);
    printf("#%d: %d\n", k++, x);
    curr = err + !!*err; // do not advance past the '\0'
  }
  return 0;
}

查看实际操作 - 与上面的代码片段不同,在 ideone 中用 1 :/ 初始化 k 并不能很好地处理以空格结尾的输入。

strtol indicates where in the string it failed.
For a string like "1 2 3 ..." it will read the 1 and fail right afterwards; if you then pass that failure point (" 2 3 ...") to strtol it will read 2 and fail right afterwards, ..., ...

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  char input[] = "6 82 -7453 4 0 63 ";
  char *err = " ", *curr = input;
  int x, k = 0;
  while (*curr && isspace((unsigned char)*err)) {
    x = strtol(curr, &err, 10);
    printf("#%d: %d\n", k++, x);
    curr = err + !!*err; // do not advance past the '\0'
  }
  return 0;
}

See it in action -- unlike the snippet above, the one at ideone initializes k with 1 :/ and doesn't deal well with inputs that end in whitespace.

醉态萌生2024-12-18 08:17:19

使用

rc = sscanf(string, "%d%n", &array[i], &len);

在循环中 。测试 rc,并使用 len 跳到下一项。

Use

rc = sscanf(string, "%d%n", &array[i], &len);

In a loop. Test the rc, and use len to skip to the next item.

忘你却要生生世世2024-12-18 08:17:19

实际上并没有那么复杂:

  1. 使用 strlen 计算字符串的长度
  2. 使用 malloc 为数组分配足够的内存
  3. 再次迭代字符串并填充数组

查看实际操作

It's really not that complicated:

  1. Calculate the length of the string with strlen
  2. Allocate enough memory for the array with malloc
  3. Iterate over the string again and populate the array

See it in action.

豆芽2024-12-18 08:17:19

多种方法之一是使用 strtok 将字符串标记为空格 &每个 strtok 调用的返回值可以与 sscanf 一起使用以获取单个整数。正如您所知,您可以迭代要与 这些行sscanf 一起使用的数组的最大长度一个>.
希望这有帮助!

One of the many ways could be to use strtok to tokenize the string with the separator as space & the return value of each strtok call can be used with sscanf for single integer. As you know the maximum length you can iterate the array to be used with sscanf something on these lines.
Hope this helps!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文