我用C编写了一个非常小的空格修整函数,它只是将有效字符复制到一个副本中,并将一个'\0'
放在末尾。
char *trim(char *line) {
char *out = strdup(line);
// copy valid chars to duplicate
char *op = out;
char *ip = line;
while (*ip != '\0') {
if (!isspace(*ip)) {
*op = *ip;
op++;
}
ip++;
}
// put second '\0' in string, although more memory is dedicated to it
*op = '\0';
return out;
}
这意味着使用类似于{'F', ' ', 'o', ' ', ' ', 'o', '\0'}
的东西调用这个函数应该返回字符串{'F', 'o', 'o', '\0', ' ', 'o', '\0'}
。
这看起来很低效。我宁愿返回:{'F', 'o', 'o', '\0'}
。
问题
\0
是什么意思?当我用strlen()
.strdup()
检查它的长度时,它就开始不正常地运行了,我是否在第一个\0
之后释放内存,使它不再专门用于字符串?发布于 2022-11-07 09:39:54
你可以这样做:
char *NewSpace = realloc(out, strlen(out) + 1);
if (NewSpace)
out = NewSpace;
测试NewSpace
是防止realloc
失败的一个防范措施,在这种情况下,它返回一个空指针,旧内存仍然被分配。(realloc
在缩短分配时不应失败,但防范问题是一种很好的做法。)
这只能通过动态分配的内存来完成。您的代码显示了out
的空间是用strdup
分配的,所以这是动态分配的内存。
请注意,内存分配例程通常以16字节或类似的单位工作,因此将7字节重新分配到4不会对内存的使用产生任何影响。将10兆字节重新分配到一个字节可能会释放内存。(这不是C标准所保证的,有些实现可能选择不这样做。)
不可能在字符串中多次出现空字符,因为字符串被定义为以第一个空字符结尾的字符序列。
可以有一个数组,其中包含多个空字符。数组是同一类型的元素序列,其元素可以具有该类型的任何值,包括多个零。数组通常用于保存字符串。当数组或数组的一部分用于保存字符串时,字符串将以第一个空字符结尾。数组中的其余元素将不被作为字符串运行的函数使用。
在C中,数组有固定的内存。(对于所谓的“可变长度数组”,在创建数组时,长度是固定的。它可能在到达数组定义的不同代码执行实例中发生变化,但在特定实例中不发生变化。)在很大程度上,数组是内存,而这并不会根据其中的数据而改变。相反,字符串是由其内容定义的;它以其第一个空字符结束。
https://stackoverflow.com/questions/74350465
复制相似问题