2

如果我正在读取 C 字符串,例如:char 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);
}

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

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

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

谢谢

4

2 回答 2

1

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

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

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

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

void processData(const char *data, char *processedData, unsigned int length) {
  memcpy(processedData,data,length*sizeof(char));
}
于 2012-11-15T17:53:32.443 回答
0

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

  1. 制作输入字符串指针const(即const char* myData),以标记myData输入字符串且其内容未被函数修改。

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

于 2012-11-15T17:51:59.027 回答