【问题标题】:Modifying string in function C在函数 C 中修改字符串
【发布时间】:2019-03-19 23:25:40
【问题描述】:

假设我想使用函数修改 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;
}

【问题讨论】:

  • 这没有提供足够的信息吗? stackoverflow.com/questions/10186765/…
  • 如果你打电话给change("HEY");,你觉得会发生什么
  • 并非所有字符串都是可变的,因此并非所有字符串都可以更改。这就是为什么通常的方法是malloc() 足够的内存并在结果分配的内存中生成更改后的字符串

标签: c arrays string char int


【解决方案1】:

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

  • 如果你想得到一个修改过的字符串,又想保留原来的怎么办?为避免破坏任意大小的原件,您需要malloc 空格、制作副本并对其进行修改。

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

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

【讨论】:

  • 明白了,谢谢。无论如何,如果我在参数中得到 char 数组或指向数组的指针,我应该能够通过调用函数 strlen() 来获取它的长度,因此不需要另一个参数“length”。对吗?
  • 视情况而定。 strlen() 计算 字符串中的字节数,直到为空——即字符串中当前数据的长度。它不会告诉您这些字节所在的数组的容量。如果您要从字符串中提取数据,或者只修改其中的字节,那很好。如果您要扩展字符串,则需要告知该函数安全使用此方法的能力。
猜你喜欢
  • 2018-07-11
  • 1970-01-01
  • 2018-07-29
  • 2013-12-27
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多