【问题标题】:Divide a string into smaller parts & organize a structure (C-programming)将字符串分成更小的部分并组织结构(C 编程)
【发布时间】:2009-10-08 17:27:59
【问题描述】:

我仍在学习 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 指向文本的给定部分。谁能帮助我如何进行?

【问题讨论】:

    标签: c string struct split calloc


    【解决方案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';
    }
    

    这应该可行。

    【讨论】:

    • 这看起来很有希望!谢谢帕特里斯。我会试一试,然后回复你:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      allStructsstruct 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')

      【讨论】:

        猜你喜欢
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多