【问题标题】:c - string manipulation to struct memberc - 对结构成员的字符串操作
【发布时间】:2010-11-17 17:17:58
【问题描述】:

根据我之前的帖子,我想出了以下代码。我确信有更好的方法来做到这一点。我想知道,那会是什么?

如果找到@,它会在大于最大字符OR 时拆分字符串。任何想法将不胜感激!

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct my_struct { 
  char *str;
};

int main () {
  struct my_struct *struc;

  int max = 5;
  char *tmp = "Hello World@Foo Bar In here@Bar Foo dot com@here@there";

  struc = malloc (20 * sizeof (struct my_struct));

  int strIdx = 0, offSet = 0;
  char *p = tmp;
  char *tmpChar = malloc (strlen (tmp) + 1), *save;
  save = tmpChar;

  while (*p != '\0') {
    if (offSet < max) {             
      offSet++;
      if (*p == '@') {
        if (offSet != 1) {
          *tmpChar = '\0';
          struc[strIdx++].str = strndup (save, max);
          save = tmpChar;
        }
        offSet = 0;
      } else
        *tmpChar++ = *p; 
    } else {                    // max
      offSet = 0;
      *tmpChar = '\0';
      struc[strIdx++].str = strndup (save, max);
      save = tmpChar;
      continue;
    }   
    p++;
  }
  struc[strIdx++].str = strndup (save, max);    // last 'save'

  for (strIdx = 0; strIdx < 11; strIdx++)
    printf ("%s\n", struc[strIdx].str);

  for (strIdx = 0; strIdx < 11; strIdx++)
    free (struc[strIdx].str);
  free (struc);
  return 0;
}

最多输出 5 个字符:

Hello
 Worl
d
Foo B
ar In
 here
Bar F
oo do
t com
here
there

【问题讨论】:

  • 一条评论(作为评论):i、j、p、c、ss 和 s 等名称不会使其更易于阅读代码。如果j 真的是offset,就这么称呼它。看起来i 是您的结构数组的索引。 string_idx,strIdx,甚至idx会更有意义。
  • @Nathon:感谢您的观察,我让它更具可读性:)

标签: c optimization string


【解决方案1】:

好吧,我会好好研究一下。首先,让我说我的格式更改是为我准备的。如果你不喜欢孤独的{s,那也没关系。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 5

struct string_bin
{ 
    char *str;
};


int main ()
{
    struct string_bin *strings;

    char *tmp = "Hello World@Foo Bar In here@Bar Foo dot com@here@there";

    char *p = tmp;
    strings = malloc (20 * sizeof (struct string_bin));
    memset(strings, 0, 20 * sizeof (struct string_bin));

    int strIdx = 0, offset = 0;
    char *cursor, *save;

    strings[strIdx].str = malloc(MAX+1);
    save = strings[strIdx].str;
    while (*p != '\0')
    {
        if (offset < MAX && *p != '@')
        {
            *(save++) = *(p++);
            offset++;
            continue;
        }
        else if (*p == '@')
            *p++;
        offset = 0;
        *save = '\0';
        strings[++strIdx].str = malloc(MAX+1);
        save = strings[strIdx].str;
    }
    *save = '\0';

    for (strIdx = 0; strings[strIdx].str != NULL; strIdx++)
    {
        printf ("%s\n", strings[strIdx].str);
        free (strings[strIdx].str);
    }

    free (strings);

    return 0;
}

最大的变化是我摆脱了你的strdup 电话。相反,我将字符串直接填充到其目标缓冲区中。我还多次调用malloc 来获取单个字符串缓冲区。这样一来,您就不会提前知道输入字符串的长度,而代价是一些额外的分配。

【讨论】:

  • 我喜欢你摆脱 strdup 调用的方法。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 2015-07-12
  • 2015-02-26
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
相关资源
最近更新 更多