c - 在函数 C 中修改字符串
问题描述
假设我想使用函数修改 char 数组。我总是看到人们使用 malloc、calloc 或指针来修改 int、char 或 2D 数组。我说得对吗,如果我说,该字符串只有在我使用 malloc 时才能从函数返回,创建该数组指针并返回他?那么为什么不通过将字符串传递给函数参数来获取/更改字符串呢?我的演示不是在参数中使用 char 数组比分配/释放更容易吗?我的概念是错误的,还是为什么我从来没有看到人们将数组传递给函数?当我看到这种更改 char 数组的方法很容易时,我只看到使用 malloc 等传递的代码,例如“char *array”,而不是“char array[]”。我错过了什么吗?
#include <stdio.h>
void change(char array[]){
array[0]='K';
}
int main(){
char array[]="HEY";
printf("%s\n", array);
change(array);
printf("%s\n",array );
return 0;
}
解决方案
如果您只需要更改字符串中的现有字符,并且字符串将在一个变量中,并且您不介意修改原始字符串的副作用,那么您的解决方案可能是可以接受的并且确实更容易。但:
如果您想获得修改后的字符串,但又想保留原始字符串怎么办?为避免破坏任意大小的原件,您需要留出
malloc
空间、制作副本并对其进行修改。如果你想扩展字符串呢?如果您的更改是在字符串中添加“YOU”,则无法修改原始字符串,因为没有空间-它会导致缓冲区溢出,因为“HEY”仅分配了4个字节(三个字母加空终止符)。同样,解决方案涉及
malloc
到工作空间。
使用您的技术进行更改的函数通常需要一个size
orlength
参数来避免数组溢出并导致崩溃和潜在的安全风险。但是尽管这避免了溢出,但如果没有足够的空间,仍然存在一个问题:静默删除一些数据?传回一个标志或特殊值以指示没有足够的空间,并期望调用者处理它?从长远来看,第一次写就更容易,而且malloc
/calloc
空间和处理必须在以后释放它等等。
推荐阅读
- database-design - SQL 图表设计问题 - 我如何在数据库中管理每个成员的日程安排?
- java - hibernate - 为什么我需要在保存实体之前将孩子放入父集合中
- c - Call-by-name 和 Call-by-macro-expansion 之间的区别
- java - java.lang.NullPointerException:尝试调用接口方法“java.lang.Object java.util.List.get(int)”
- javascript - 如何计算仅使用一个提供商的用户?
- c# - Discord 命令在尝试读取文本文件后停止
- postgresql - 无法与远程 heroku 数据库建立 psql 会话
- laravel - 覆盖 relationship 列以仅显示具有特定角色的用户
- salesforce - 我该如何解决这个错误。我想完成触发器分配
- python - Python 新手:“NoneType”类型的参数不可迭代