我还在学习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
指向文本的给定部分。任何人都可以帮我解决这个问题吗?
答案 0 :(得分: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';
}
这应该有用。
答案 1 :(得分:0)
嗯,c字符串只是一个由空字符('\0'
)终止的字符数组。因此,您需要遍历大text[500]
个数组,在每个myString
部分中放置100个字符。请记住,由于c字符串为空终止,因此您只能在char part[100]
中存储99个字符。
此外,如果您只想结束空白字符(空格(' '
),新行('\n'
)或标签('\t'
))上的部分,则必须找到最接近100个字符的限制并将字符串拆分到那里。
答案 2 :(得分: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)混淆