2

我是 C 的新手,我正在尝试找出解决这个问题的最佳方法。我有 2 个字符串都是char *'s。

它们在字符串本身中有多个 \n 字符,它们的长度通常约为 1000 个字符。我只想显示不同的单行。通常,整个字符串中只有一个字符(或相对较小的数字)会有所不同。所以我希望做到这一点,这样我就可以只显示一个更改的行(从 \n 到 \n 的整个字符串)。

我不要求任何人编写代码,甚至提供代码示例,只是理论上最有效的方法是什么?

我一直在研究使用 strtok,使用 '\n' 符号作为分隔符,然后使用 strcmp 比较两个字符串,如果它们不相等,那么我可以将该字符串添加到“old_data”和“new_data” “ 大批。这是一个不好的方法吗?

任何建议都会有很大帮助。

4

2 回答 2

1

听起来您走在正确的轨道上:strsep会让您通过换行符将字符串分块。要记住的一件事是,它对原字符串进行操作,并且不分配任何新内存,这既是一种祝福,也是一种诅咒。

可能最节省内存的方法是查看分配指针数组以保存“old_data”和“new_data”值,然后将指向原始字符串的指针直接保存到原始字符串中,而不是复制字符串本身. 只要您原来的两个字符串会留在您身下/不会从您身下释放,这可以为您节省大量内存。

如果您永远不会从数组中删除字符串,那么实现数组的一种简单(但有效)的方法是维护两个状态变量——一个计数和一个容量——并且每次你需要时将容量加倍溢出数组。例如:

char **strArray = NULL;
unsigned int capacity = 10;
unsigned int count = 0;

strArray = malloc(capacity * sizeof(char *));

/* on insert */
if (count == capacity)
{
    capacity *= 2;
    strArray = realloc(strArray, capacity * sizeof(char *));
}

strArray[count++] = pointerIntoOriginalString;

祝你好运!

于 2012-12-17T22:32:53.657 回答
1

strtok() 不可重入。如果要使用 strtok 执行此操作,则必须一个接一个地遍历数组。我推荐使用 strtok_r(),它是 strtok 的可重入实现。

您需要担心的另一个考虑因素是确保您的 old_data 和 new_data 数组足够大或可调整大小。马特的回答显示了一个调整数组大小的简单示例,尽管如果您是 C 新手,您可能只想声明如下内容:

char *new_data[2000];
char *old_data[2000];

特别是因为听起来您很清楚缓冲区中有多少行。

于 2012-12-17T22:36:53.773 回答