0

私は Mac OSX で作業しており、bash をシェルとして使用しています。私は C で作業しており、ファイルの番号を付け直すファイルを作成しようとしています。私のコードの重要な部分は次のとおりです。

int i;
for (i=0; i<numberOfFiles; i++) {
    strcpy(fileName,""); //Set to Null
    char append[formatLength]; //String being appended
    sprintf(append,"%%0%dd", formatLength); //example output: %04d
    strcat(fileName,filePrefix); //Attached Prefix
    strcat(fileName,append); //Attaches appended part

   //Missing code: Part which equvaluates %04d as int i, such as 0023.
}

これにより、探している正しい文字列形式が得られます (たとえば、formatLength=4): filePrefix+%04d. iただし、ファイルが file0001、file0002 などのようになるように、文字列内の %04d を評価して として評価する必要があります。

誰にでもアイデアはありますか。ご協力いただきありがとうございます。

4

5 に答える 5

3

で作成した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 回目の呼び出しでパターン文字列の一部にならないようにします。

于 2013-07-23T18:46:09.373 に答える
1

私があなたの質問を正しく理解しているなら、あなたは次のように言うことができるはずです

char result[(sizeof filePrefix/sizeof (char)) + formatLength];
sprintf(result, fileName, i);

fileNameのように見えるので"filePrefix%04d"。目的のファイル名が に保存されresultます。小さすぎる可能性があるため(たとえば、 の場合)、fileNameと言って再格納することはお勧めしません。sprintf(fileName, fileName, i)fileNameformatLength = 9

(sizeof filePrefix/sizeof (char))のサイズを見つける必要があることに注意してくださいfilePrefix(これも可能性があります)。その後、必要な文字数を確認するためchar*に追加しますformatLength

于 2013-07-23T18:30:42.517 に答える
1

フォーマット文字列を作成し、それを別のフォーマッタ呼び出しのフォーマット文字列として使用できます。プレフィックスと数値の書式指定子を単一の文字列に組み込むことができることに注意してください。strcat 呼び出しは必要ありません。

与えられた:

char format_specifier[256] ;

次に、例のループ コードを次のように置き換えることができます。

snprintf( format_specifier,
          sizeof( format_specifier),
          "%s%%0%dd",
          filePrefix, 
          formatLength ) ; // Create format string "<filePrefix>%0<formatLength>", 
                           // eg. "file%04d"

snprintf( fileName,         // Where the filename will be built
          sizeof(fileName), // The length of the filename buffer
          format_specifier, // The previously built format string
          i ) ;             // The file number.

上記は配列であると想定しましたfileNameが、配列へのポインターである場合、 sizeof(fileName) は正しくありません。もちろん、アカデミックではsprintfなく使用することを選択した場合。snprintf

于 2013-07-23T19:08:18.770 に答える