假设我有一个包含句子的char
数组,我希望将该句子复制到不同的数组中,但过滤某个字符:
char a[] = "hello everybody";
char b[sizeof(a)];
char idontwantyou = 'e';
int it = 0;
for (int i=0; i<sizeof(a); ++i)
if (a[i]!=idontwantyou)
b[it++] = a[i];
我必须为b
分配相同数量的内存而不是a
的大小,因为我不知道没有不需要的字符的句子大小吗?
现在,我的b
数组的句子为hllo vrybody'@·
&amp;¡我的意思是,阵列末尾有“垃圾”。
我有什么方法可以“剪掉”尾巴中的垃圾,因此b
的大小与it
的大小相同吗?
我刚刚将b
复制到我定义为char c[sizeof(b)]
的新数组中,但这似乎不是一个好习惯。
realloc
中的b
可能会做我想做的事情吗?
答案 0 :(得分:1)
就地消除不需要的字符,并分配数组大小减少:
char *a = strdup("hello everybody");
char idontwantyou = 'e';
char *b = a;
char *c = a;
消除不需要的角色:
while(*b)
{
if(*b != idontwantyou)
{
*c=*b;
++c;
}
++b;
}
*c='\0';
减小分配数组的大小:
b=realloc(a, strlen(a) + 1);
if(NULL == b)
/*Handle error... */;
a=b;
测试结果:
printf("array = \"%s\"\n", a);
输出应为:
array = "hllo vrybody"
答案 1 :(得分:0)
sizeof(b)
等于sizeof(a)
,因为这是b
的实际大小。要使用realloc
,您必须首先使用malloc
分配b
。
这将以类似于此的方式完成:
char a[] = "hello everybody";
/* better use strlen here -- it will also work with char*, and not only with
statically allocated arrays */
char *b = malloc(strlen(a)+1);
/* your code here */
char *tmp = realloc(b, it);
if (!tmp) {
free(b);
/* some error here! */
} else {
b = tmp;
/* continue working with b */
}
这里有一些重要的内容:
完成后你必须手动free
b
,因为它是在堆而不是堆栈上分配的,因此你必须自己释放内存而不是它会在功能出口自动释放。
realloc
的返回值可能为NULL。在这种情况下,仍然会分配旧内存,您必须进行某种错误处理(如if所示)。
如果realloc
成功,tmp
指向新的记忆区域且b
无效,这就是我们使用b
覆盖tmp
的原因。
答案 2 :(得分:0)
另一种方法是在字符串上运行两次,一次计数,一次复制。
您应该根据此操作的重要程度来评估问题 程序的总体成本和CPU +内存配置文件。最有可能的是,它根本不重要。 在这种情况下,最简单的可能是最好的。