首页 > 解决方案 > 在函数 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;
}

标签: carraysstringcharint

解决方案


如果您需要更改字符串中的现有字符,并且字符串将在一个变量中,并且您不介意修改原始字符串的副作用,那么您的解决方案可能是可以接受的并且确实更容易。但:

  • 如果您想获得修改后的字符串,但又想保留原始字符串怎么办?为避免破坏任意大小的原件,您需要留出malloc空间、制作副本并对其进行修改。

  • 如果你想扩展字符串呢?如果您的更改是在字符串中添加“YOU”,则无法修改原始字符串,因为没有空间-它会导致缓冲区溢出,因为“HEY”仅分配了4个字节(三个字母加空终止符)。同样,解决方案涉及malloc到工作空间。

使用您的技术进行更改的函数通常需要一个sizeorlength参数来避免数组溢出并导致崩溃和潜在的安全风险。但是尽管这避免了溢出,但如果没有足够的空间,仍然存在一个问题:静默删除一些数据?传回一个标志或特殊值以指示没有足够的空间,并期望调用者处理它?从长远来看,第一次写就更容易,而且malloc/calloc空间和处理必须在以后释放它等等。


推荐阅读