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* But How*w to Process* を含むファイルから文字列を読み取ったとします。最初の 3 秒を含む部分文字列を取得したい。だから私のprocessedData私はA t*est String*です

ファイルのすべての行に対してこれをできるだけ効率的に実行したいと考えています。

ありがとう

4

2 に答える 2

1

Problem is that your function is inherently unsafe, this because you make assumption about the allocated memory by parameters you pass to the function.

If someone is going to call setProcessedData by passing a string which is shorter than 5 bytes then bad things will happen.

In addition you are copying memory with memcpy by using a raw dimension, a safer approach, even if it is quite picky in this situation, is to use sizeof(char)*5.

Best thing you can do, though, is to follow the same approach used by safer functions of standard library like strcpy vs strncpy: you pass a third parameter which is the maximum length that should be copied, eg:

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

I think you can improve your code:

  1. Making the input string pointer const (i.e. const char* myData), to mark that myData is an input string and its content is not modified by the function.

  2. Pass the size of the destination buffer, so in your function you can do proper checks and avoid buffer overruns (a security enemy).

于 2012-11-15T17:51:59.027 に答える