【问题标题】:C String PassingC 字符串传递
【发布时间】:2012-11-04 09:22:53
【问题描述】:

如果我正在读取 C 字符串,例如: 字符 myData[100]; 我想处理这些数据并从中生成一个副本,所以我的代码如下所示:

char myData[100], processedData[50];

loop
    fill myData from file...
    setProcessedData(myData, processedData);
    store processedData to file...

其中 setProcessedData 是一个返回已处理字符串的函数。假设为简单起见,它返回一个子字符串

void setProcessedData (char *myData, char *processedData) {
     memCopy( processedData, myData, 5);
}

我做错了什么吗?喜欢创建额外的对象/字符串?有更好的方法吗?

假设我从包含 * 的文件中读取字符串 我是*测试*测试字符串*但如何*如何处理*。 我想获得具有前 3 个 的子字符串。所以我的处理数据 我是一个测试字符串*

我希望尽可能高效地对文件的所有行执行此操作。

谢谢

【问题讨论】:

  • 没有看到实际代码,我们无法告诉您做错了什么,如果您遇到错误,您应该发布它们。

标签: c string pass-by-reference


【解决方案1】:

问题是您的函数本质上是不安全的,这是因为您通过传递给函数的参数来假设分配的内存。

如果有人要通过传递一个小于 5 个字节的字符串来调用setProcessedData,那么就会发生不好的事情

此外,您通过使用原始维度使用memcpy 复制内存,更安全的方法是使用sizeof(char)*5,即使在这种情况下非常挑剔。

不过,您可以做的最好的事情是遵循标准库的更安全函数使用的相同方法,例如 strcpystrncpy:您传递第三个参数,它是应该复制的最大长度,例如:

void processData(const char *data, char *processedData, unsigned int length) {
  memcpy(processedData,data,length*sizeof(char));
}

【讨论】:

  • 谢谢,但在处理字符串之前我不知道最大长度。假设字符串有。所以我从文件中读取它:我是 A test String But How* To Find* Out。我想提取子字符串作为前 3 个。所以processedData将是我一个test String我该怎么做?
【解决方案2】:

我认为你可以改进你的代码:

  1. 使输入字符串指针const(即const char* myData),标记myData是一个输入字符串,其内容未被函数修改。 p>

  2. 传递目标缓冲区的大小,以便在您的函数中进行适当的检查并避免缓冲区溢出(安全敌人)。

【讨论】:

    猜你喜欢
    • 2011-10-08
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2011-01-05
    • 2017-04-06
    • 2011-11-26
    相关资源
    最近更新 更多