で作成したsnprintf()
文字列を、次の への呼び出しのフォーマット文字列として使用しますsnprintf()
。
int formatLength = /* some input */;
char filePrefix[FILEPREFIX_LEN]; // assigned by some input
const int FILENAME_LEN = strlen(filePrefix) + formatLength + 1; // +1 for terminating '\0'
char fileName[FILENAME_LEN];
int i;
for (i=0; i<numberOfFiles; i++) {
char temp[TEMPLATE_LEN]; // where TEMPLATE_LEN >= FILEPREFIX_LEN + 3 + number of characters in the decimal representation of formatLength
snprintf(temp, TEMPLATE_LEN, "%s%%0%dd", filePrefix, formatLength);
// error check snprintf here, in case the destination buffer was not large enough
snprintf(fileName, FILENAME_LEN, temp, i);
// error check snprintf here, in case the destination buffer was not large enough
// use fileName
}
したがって、filePrefix
= "file"の場合、= fileName
"file0001"、"file0002"、"file0003" などとなります...
この作業の多くは実際には依存していないi
ため、次のようにループの外に移動できます。
int formatLength = /* some input */;
char filePrefix[FILEPREFIX_LEN]; // assigned by some input
const int FILENAME_LEN = strlen(filePrefix) + formatLength + 1; // +1 for terminating '\0'
char fileName[FILENAME_LEN];
char temp[TEMPLATE_LEN]; // where TEMPLATE_LEN >= FILEPREFIX_LEN + 3 + number of characters in the decimal representation of formatLength
snprintf(temp, TEMPLATE_LEN, "%s%%0%dd", filePrefix, formatLength);
// error check snprintf here, in case the destination buffer was not large enough
int i;
for (i=0; i<numberOfFiles; i++) {
snprintf(fileName, FILENAME_LEN, temp, i);
// error check snprintf here, in case the destination buffer was not large enough
// use fileName
}
これらの場合、temp
(「temporary」ではなく「template」の略) は「prefix%04d」になります (たとえば、4 の prefixLength と「prefix」の filePrefix の場合)。そのため、関数ファミリーfilePrefix
にとって特別な意味を持つ文字が含まれないように注意する必要があります。printf
そうならないことがアプリオリにわかっている場合は、問題ありません。
ただし、可能であれば、次の 2 つのいずれかを行う必要があります。filePrefix
すべての特殊文字をエスケープすることで、使用する前に を処理できます。または、snprintf()
呼び出しを次のように変更できます。
snprintf(temp, TEMPLATE_LEN, "%%s%%0%dd", formatLength);
// other stuff...
snprintf(fileName, FILENAME_LEN, temp, filePrefix, formatLength);
最初%
のsnprintf()
. これにより、テンプレート パターン "%s%04d" (たとえば、prefixLength が 4 の場合) が作成され、2 回目の呼び出しで filePrefix を追加して、その内容が 2 回目の呼び出しでパターン文字列の一部にならないようにします。