1

我仍在学习 C,但在弄清楚如何处理这个问题上遇到了一些麻烦。好吧,我有两个结构:

struct myStruct {
    ...
    struct myString *text[5];
    ...
} allStructs;

struct myString {
    char part[100];
};

目标是allStruct[n]指向文本的 5 个不同部分,每行 100 个字符。所以我分配空间:

allStructs = calloc(n, sizeof(allStructs));

然后,假设我有一个填充char text[500],我想分成 5 个部分,并allStructs[n].text[n].part指向文本的给定部分。谁能帮助我如何进行?

4

3 回答 3

1

简短的回答:您不能这样做,因为您没有考虑使用 '\0' 字符来终止每个字符串。

更长的答案:更改这样的结构以获得更大的灵活性:

struct myStruct {
   struct myString *text;
}
struct myString {
   char *part;
}

分配应该是:

struct myStruct *allStruct = calloc(n, sizeof(struct myStruct));

所以你在 n struct myStruct 上有一个指针/数组。

然后初始化allStruct的所有成员;

for( i=0; i<n; ++i )
{
   allStruct[i].text = calloc(5, sizeof(myString));
   // Following for only needed if you want new strings by using the strncpy (see above)
   for( y=0; y<5; ++y )
   {
      allSTruct[i].text[y].part = calloc(101, sizeof(char));
   }
}

现在你已经初始化了所有的变量。

将 500 个字符的长字符串复制到 allStruct[n] 中:

for( i=0; i<5; i++ )
{
   allStructs[n].text[i].part = &text[i*100]; // If you want to point on the existing string
   // OR
   strncpy(allStructs[n].text[i].part, &text[i*100], 100); // If you want to have new strings

   // In all case, terminate the string with '\0'
   allStructs[n].text[i].part[100] = '\0';
}

这应该有效。

于 2009-10-08T17:47:52.797 回答
0

好吧,c 字符串只是一个以空字符 ( '\0') 结尾的字符数组。因此,您需要遍历大型text[500]数组,在每个部分中放置 100 个字符myString。请记住,由于 c 字符串是空终止的,因此您只能在char part[100].

此外,如果您只想以空白字符(空格 ( ' ')、换行符 ( '\n') 或制表符 ( '\t'))结束一部分,则必须找到最接近 100 个字符限制的部分并将字符串拆分到那里。

于 2009-10-08T17:41:47.677 回答
0

allStructs是一个类型的对象struct myStruct。您不能使用 .“重新分配”它calloc()

您的对象allStructs具有text一个由 5 个指针组成的数组的成员。
您需要将这些指针设置为指向该struct myString类型的特定对象。

char text[500]将字符从各种对象复制到之后struct myString,一切都会正常进行。

伪代码

struct myString part1;
struct myString part2;
struct myStruct allstructs;
allStructs.text[0] = &part1;
allStructs.text[1] = &part2;
strncpy(part1.part, text, 99);
part1.part[99] = '\0';

printf("part2: %s\n", allStructs.text[1].text);

哦!并且不要混淆allStructs(以's'结尾)和allStruct(没有's')

于 2009-10-08T17:52:01.523 回答