C - 将X长度的字符串拆分/存储到结构数组中

时间:2010-11-12 19:17:44

标签: c string pointers struct

我正在尝试每X个字符分割一个字符串,然后将每一行存储在一个结构数组中。但是,我想知道什么是短暂而有效的方式。我想也许我可以使用sscanf,但不太确定如何使用#include <stdio.h> #include <stdlib.h> #include <string.h> struct st {char *str;}; int main () { struct st **mystruct; char tmp[] = "For configuration options (arch/xxx/config.in, and all the Config.in files),somewhat different indentation is used."; size_t max = 20, j = 0; // max length of string size_t alloc = strlen(tmp)/max + 1; mystruct = malloc(alloc * sizeof *mystruct); for (j = 0; j < alloc; j++) mystruct[j] = malloc(sizeof *mystruct[j]); const char *ptr = tmp; char field [ max ]; int n; while (*ptr != '\0') { int line = sscanf(ptr, "%s", field, &n); // not sure how to use max in here mystruct[j]->str = field; field[0]='\0'; if (line == 1) ptr += n; if ( n != max ) break; ++ptr; ++j; } return 0; } 。任何帮助将不胜感激。到目前为止,我有:

For configuration op
tions (arch/xxx/conf
ig.in, and all the C
onfig.in files),some
what different inden
tation is used.

所以当我迭代我的结构时,我可以得到类似的东西:

{{1}}

5 个答案:

答案 0 :(得分:3)

你可以使用strncpy。

供参考:

char field [ max ];
while (...) {
    mystruct[j]->str = field;

这有两个问题:(1)数组中的每个结构都将指向同一个字符串,该字符串将具有您扫描的最后一个字符的值,(2)它们指向一个变量stack,所以当这个函数返回时,它们将被删除。这并没有在这里明显地表现出来(例如你的程序没有爆炸)因为函数恰好是'main',但是如果你把它移到一个单独的例程并调用它来解析一个字符串,你就会得到回垃圾

mystruct不需要指向指针。对于1D数组,只需为N个元素分配块N * sizeof *myarray

处理结构时常见的C语言是使用typedef,因此您不必一直键入struct foo。例如:

typedef struct { 
   int x, y;
} point;

现在,您只需说struct point pt,而不是输入point pt

答案 1 :(得分:1)

如果您的字符串在拆分后不会改变,我建议使用这样的结构:

struct st {
    char *begin;
    char *end;
};

或替代方案:

struct st {
    char *s;
    size_t len;
};

然后,不要创建所有这些新字符串,只需标记每个字符串在结构中的开始和结束位置。将原始字符串保留在内存中。

答案 2 :(得分:0)

一种选择是按字符进行。

计算您当前正在进行的行数。

分配内存=(strlen(tmp)+ number_of_lines)* sizeof(char)

遍历输入字符串,将字符从输入复制到新分配的内存。每隔20个字符,插入一个空字节来分隔该字符串。将指针保存到结构数组中每行的开头。

答案 3 :(得分:0)

这很容易吗?

#define SMAX 20
typedef struct {char str[SMAX+1];} ST;

int main()
{
  ST st[SMAX]={0};
  char *tmp = "For configuration options (arch/xxx/config.in, and all the Config.in files),somewhat different indentation is used.";
  int i=0,j;
  for( ; (st[i++]=*(ST*)tmp).str[SMAX]=0 , strlen(tmp)>=SMAX; tmp+=SMAX );

  for( j=0;j<i;++j )
    puts(st[j].str);

  return 0;
}

答案 4 :(得分:0)

您可以使用(非C标准但GNU)函数strndup()。

#define _GNU_SOURCE
#include <string.h>

struct st {char *str;};

int main ()
{
   struct st *mystruct; /* i wonder if there's need for double indirection... */

   char tmp[] = "For configuration options (arch/xxx/config.in, and all the Config.in files),somewhat different indentation is used.";
   size_t max = 20, j = 0; // max length of string
   size_t alloc = (strlen(tmp) + max - 1)/max; /* correct round up */

   mystruct = malloc(alloc * sizeof mystruct);
   if(!mystruct) return 1; /* never forget testing if allocation failed! */

   for(j = 0; j<alloc; j++)
   {
      mystruct[j].str = strndup(tmp+alloc*max, max);
   }
}