我正在尝试每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}}
答案 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);
}
}