如何在不修改C中原始字符串的情况下使字符串小写?

yhived7q  于 2023-04-29  发布在  其他
关注(0)|答案(2)|浏览(99)

我正在使用一个函数,它将指向字符串的指针作为参数,并以小写形式返回:

char* strLower(char* s) {
    for(char *p=s; *p; p++) *p=lower(*p);
    return s;
}

到目前为止,它确实正确地返回了小写字符串,但它也在函数本身之外修改了原始字符串(作为参数的字符串)。我该如何避免这种情况?

dgenwo3n

dgenwo3n1#

为此,该函数将需要一些分配的内存来存储结果。至少有三种策略:
1.您可以将此内存作为结果缓冲区提供给函数:

char* strLower(const char* src, char *dest) { ...

在这种情况下,dest缓冲区的大小是否足够是调用方的责任。
1.函数可以分配内存本身

char* strLower(const char* src) {
   char *dest = malloc(1+strlen(src));
   ...

在这种情况下,调用方负责在分配的内存不再使用时释放它(否则将出现memory leak)。除非有很好的理由,否则我不推荐使用此选项,因为动态内存分配通常应该对mallocfree进行明确的对称调用,以确保内存被释放。在这种情况下,调用strLower()是否会分配内存并不明显。
1.函数可以有一个静态分配的buffer

#define MAX_STRING_SIZE 80+1
char* strLower(const char* src) {
   static char dest[MAX_STRING_SIZE];
   ...

在这种情况下,调用者必须知道返回的字符串将在下次调用strLower()时被覆盖。
上述可能性都不是理想的,所以除非有反对的理由,我建议保持函数原样。然后调用者可以复制原始字符串(例如。例如,使用strdup()),以防需要两个版本的字符串。这将避免复制/内存分配的开销(如果不需要),并清楚地表明调用者有责任释放任何已分配的内存。

cngwdvgl

cngwdvgl2#

strdup()/strndup() ¹或malloc()strcpy()复制字符串。

char *strLower (const char *s) 
{
    char *cp = strdup (s);
    /* Now work with it. */
}

使用后不要忘记free()返回字符串。

脚注:

1
strdup()strndup()将包含在即将推出的C2 X标准中。

相关问题