Могу ли я использовать две * точности в строковом формате из двух строк? - PullRequest
0 голосов
/ 01 октября 2010

. * Точность не указана в строка формата, но как дополнительный целочисленный аргумент предшествующий аргумент, который должен быть отформатирована.

#define SUFF ".txt"
#define MAX_STR 50

fileName[MAX_STR];
name ="myFile"

sprintf( fileName, "%s%s", name, SUFF ); //fileName = "myFile.txt"

Теперь я хочу связать строки с точностью.

Основная вещь, которую я пытаюсь сделать (но с более динамическими вычислениями, поэтому я использую '*'):

sprintf( fileName, "%.*s%.*s", 46, 4, name, SUFF );

Однако даже это создает исключение времени выполнения.

Более конкретно:

sprintf( fileName, "%.*s%.*s",
         MAX_STR - (int) sizeof(SUFF), (int) sizeof(SUFF),
         name, SUFF );

Ответы [ 3 ]

3 голосов
/ 01 октября 2010

У вас неправильный порядок аргументов переменных.Аргумент ширины идет вместе с аргументом объекта (он должен непосредственно предшествовать объекту).

sprintf(fileName, 
        "%.*s%.*s", 
        MAX_STR - (int) sizeof(SUFF), // precision and...
        name,                         // ...object
        (int) sizeof(SUFF),           // precision and...
        SUFF                          // ...object
       ); 

Даже если вы собираетесь использовать спецификатор ширины, все же гораздо лучше использовать snprintf вместо sprintf.

2 голосов
/ 01 октября 2010

Вы перепутали порядок аргументов в финале sprintf. Должно быть так:

sprintf( fileName, "%.*s%.*s",
         MAX_STR - (int) sizeof(SUFF), name,
         (int) sizeof(SUFF), SUFF );

Здесь следует отметить некоторые дополнительные вещи:

  1. sprintf - неподходящий инструмент для задания, если вам выделены строки, определенные во время компиляции, и такая точность передачи не нужна, поскольку размеры также фиксированы. Нечто вроде char fileName[] = "myFile" SUFF; более чем достаточно.
  2. Хороший компилятор (я предполагаю, что вы используете MSVC по вашему архаичному стилю), фактически проанализирует аргументы для sprintf и сообщит вам во время компиляции о вашей ошибке. Посмотрите на атрибут format .
1 голос
/ 01 октября 2010

Часто более простой вариант - asprintf () - если он достаточно переносимый (раньше это было проблемой в прошлом тысячелетии, когда я использовал C, а не C ++) - надеюсь, он теперь стандартизирован и универсален.Это не так быстро, как при распределении памяти, которое вам нужно явно освободить впоследствии, но позволяет программисту мыслить с точки зрения форматирования любых входных данных без необходимости прыгать через обручи или добавлять произвольные ограничения на их размер, что позволяет избежать множества мелких ошибоки ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...