我正在练习面试。 我目前坚持的问题是在C中反转一个常量字符串。我知道,因为str2是const,我可以修改str2指向的位置,但不能修改它的值。 我有一个名为reverse_const的函数。 它会将const char * str_const反转并打印出来。 但是,当我尝试从main方法反转后打印st2时,字符串不再反转。 它就像reverse_const()暂时改变了str2的内存位置。 我在这做错了什么?
#include #include void reverse(char *str){ int c_size = strlen(str); char *c_begin = str, *c_end = str + (c_size - 1); int i; for(i = 0; i < c_size / 2; i++){ *c_begin ^= *c_end; *c_end ^= *c_begin; *c_begin ^= *c_end; c_begin++; c_end--; } } void reverse_const(const char *str_const){ int c_size = strlen(str_const); char str[c_size]; strcpy(str, str_const); char *c_begin = str, *c_end = str + (c_size - 1); int i; for(i = 0; i < c_size / 2; i++){ *c_begin ^= *c_end; *c_end ^= *c_begin; *c_begin ^= *c_end; c_begin++; c_end--; } str_const = str; printf("%sn", str_const); } int main(){ char str1[] = "Indiana"; char *str2 = "Kentucky"; printf("TESTS:nString 1 pre-reversal: %sn", str1); reverse(str1); printf("String 1 post-reversal: %sn", str1); printf("Constant string 2 pre-reversal: %sn", str2); reverse_const(str2); printf("Constant string 2 post-reversal: %sn", str2); }
如果你想在main()
反转str2
,你需要将一个足够大的缓冲区传递给reverse_const
来保存反向字符串,或者你需要在reverse_const
动态分配存储空间(一个局部变量长度数组赢了’ t)):
#include ... void reverse_const (const char **str_const) { int c_size = strlen (*str_const); char *str = calloc (c_size + 1, sizeof *str); strcpy (str, *str_const); char *c_begin = str, *c_end = str + (c_size - 1); int i; for (i = 0; i < c_size / 2; i++) { *c_begin ^= *c_end; *c_end ^= *c_begin; *c_begin ^= *c_end; c_begin++; c_end--; } *str_const = str; printf ("%sn", *str_const); } int main (void) { char str1[] = "Indiana"; char *str2 = "Kentucky"; printf ("TESTS:nString 1 pre-reversal: %sn", str1); reverse (str1); printf ("String 1 post-reversal: %sn", str1); printf ("Constant string 2 pre-reversal: %sn", str2); reverse_const ((const char **)&str2); printf ("Constant string 2 post-reversal: %sn", str2); free (str2); return 0; }
产量
$ ./bin/revconststr TESTS: String 1 pre-reversal: Indiana String 1 post-reversal: anaidnI Constant string 2 pre-reversal: Kentucky ykcutneK Constant string 2 post-reversal: ykcutneK
返回指针
您还有一个选项可以将指针返回到str
以分配给main()
str2
。 这是您通常希望看到的更多内容。 如果您有任何疑问,请与我们联系:
char *reverse_const2 (const char **str_const) { int c_size = strlen (*str_const); char *str = calloc (c_size + 1, sizeof *str); strcpy (str, *str_const); char *c_begin = str, *c_end = str + (c_size - 1); int i; for (i = 0; i < c_size / 2; i++) { *c_begin ^= *c_end; *c_end ^= *c_begin; *c_begin ^= *c_end; c_begin++; c_end--; } //*str_const = str; printf ("%sn", *str_const); return str; } int main (void) { char str1[] = "Indiana"; char *str2 = "Kentucky"; printf ("TESTS:nString 1 pre-reversal: %sn", str1); reverse (str1); printf ("String 1 post-reversal: %sn", str1); printf ("Constant string 2 pre-reversal: %sn", str2); str2 = reverse_const2 ((const char **)&str2); printf ("Constant string 2 post-reversal: %sn", str2); free (str2); return 0; }
当您通过参数传递时,该函数将获得一个副本。 str_const = str;
分配到该副本。 你可以传递一个指向指针的指针,以便能够在函数外部更改指针的值,但是你要在堆栈上分配字符串副本,因此一旦你离开reverse_const
的范围,字符串副本就会变得无效这里没有意义。
如果您想要一个在reverse_const
结束时reverse_const
的字符串副本,请使用malloc
分配数组,或者使用strdup
进行分配和复制。 你必须以某种方式返回malloc'ed
指针(通过指针指向参数的返回值),然后调用者将有责任在完成它后free
该malloc
的ed内存。
您需要编写函数,以便有一些方法可以返回修改后的参数。
一个这样的解决方案是传递参考 :
void reverse_const(const char **str_const){ const char *in = *str_const; char *out = malloc(strlen(in)+1); /* write to out */ *str_const = out; }
但更好的方法是使用返回值:
char *reverse_const(const char *str_const){ const char *in = str_const; char *out = malloc(strlen(in)+1); /* write to out */ return out; }
返回类型可以是const char *
,但这是一个不必要的限制,因为您知道可以安全地修改返回的字符串。
请注意,这两个示例都使用malloc
。 数组不能以这种方式传回数组,因为它们存在于堆栈中并在函数退出时被销毁。
每当一个长时间运行的程序使用malloc
,代码中的某个地方确实应该匹配free
,否则你会有内存泄漏。 这是一个痛苦,但所有C程序员必须掌握的东西。
这里的问题是您修改传递给reverse_const
的参数,但C中的参数通过值传递,这意味着它们被复制。 您在函数中修改的变量是原始指针的副本,更改副本当然不会更改原始指针。
C没有通过引用传递这里需要的,但它可以通过使用指针来模拟 ,在你的函数的情况下,你需要传递指针指针,然后使用解引用运算符*
来修改指针的指针指针指向,并在调用函数时使用address-of运算符。
以上就是c/c++开发分享修改C中的const char *相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549328.html