我正在使用一个函数,它将指向字符串的指针作为参数,并以小写形式返回:
char* strLower(char* s) { for(char *p=s; *p; p++) *p=lower(*p); return s; }
到目前为止,它确实正确地返回了小写字符串,但它也在函数本身之外修改了原始字符串(作为参数的字符串)。我该如何避免这种情况?
dgenwo3n1#
为此,该函数将需要一些分配的内存来存储结果。至少有三种策略:1.您可以将此内存作为结果缓冲区提供给函数:
char* strLower(const char* src, char *dest) { ...
在这种情况下,dest缓冲区的大小是否足够是调用方的责任。1.函数可以分配内存本身:
dest
char* strLower(const char* src) { char *dest = malloc(1+strlen(src)); ...
在这种情况下,调用方负责在分配的内存不再使用时释放它(否则将出现memory leak)。除非有很好的理由,否则我不推荐使用此选项,因为动态内存分配通常应该对malloc和free进行明确的对称调用,以确保内存被释放。在这种情况下,调用strLower()是否会分配内存并不明显。1.函数可以有一个静态分配的buffer:
malloc
free
strLower()
#define MAX_STRING_SIZE 80+1 char* strLower(const char* src) { static char dest[MAX_STRING_SIZE]; ...
在这种情况下,调用者必须知道返回的字符串将在下次调用strLower()时被覆盖。上述可能性都不是理想的,所以除非有反对的理由,我建议保持函数原样。然后调用者可以复制原始字符串(例如。例如,使用strdup()),以防需要两个版本的字符串。这将避免复制/内存分配的开销(如果不需要),并清楚地表明调用者有责任释放任何已分配的内存。
strdup()
cngwdvgl2#
用strdup()/strndup() ¹或malloc()和strcpy()复制字符串。
strndup()
malloc()
strcpy()
char *strLower (const char *s) { char *cp = strdup (s); /* Now work with it. */ }
使用后不要忘记free()返回字符串。
free()
1strdup()和strndup()将包含在即将推出的C2 X标准中。
2条答案
按热度按时间dgenwo3n1#
为此,该函数将需要一些分配的内存来存储结果。至少有三种策略:
1.您可以将此内存作为结果缓冲区提供给函数:
在这种情况下,
dest
缓冲区的大小是否足够是调用方的责任。1.函数可以分配内存本身:
在这种情况下,调用方负责在分配的内存不再使用时释放它(否则将出现memory leak)。除非有很好的理由,否则我不推荐使用此选项,因为动态内存分配通常应该对
malloc
和free
进行明确的对称调用,以确保内存被释放。在这种情况下,调用strLower()
是否会分配内存并不明显。1.函数可以有一个静态分配的buffer:
在这种情况下,调用者必须知道返回的字符串将在下次调用
strLower()
时被覆盖。上述可能性都不是理想的,所以除非有反对的理由,我建议保持函数原样。然后调用者可以复制原始字符串(例如。例如,使用
strdup()
),以防需要两个版本的字符串。这将避免复制/内存分配的开销(如果不需要),并清楚地表明调用者有责任释放任何已分配的内存。cngwdvgl2#
用
strdup()
/strndup()
¹或malloc()
和strcpy()
复制字符串。使用后不要忘记
free()
返回字符串。脚注:
1
strdup()
和strndup()
将包含在即将推出的C2 X标准中。