2013-04-07 5 views
1

Определяет:Вставка пустого символа в snprintf

  • CHAR_BACKSLASH определяется как '\\' или 0x5c

Переменные:

  • WorkingDir является C-Шнура
  • MyFilePath представляет собой С-струнной

    int len = strlen(workingDir); 
    char lastChar = workingDir[len - 1]; 
    

Ниже MyFilePath получает формируется из WorkingDir + обратной косой черты + буквальным "myfile.txt"

В тройственный аргумент, я пытаюсь поставить обратную косую черту, если еще нет обратной косой черты.

snprintf(myFilePath, 
      sizeof(myFilePath), 
      "%s%s%s", 
      workingDir, 
      (lastChar == CHAR_BACKSLASH) ? "" : "\\", 
      "myfile.txt"); 

Если возможно, я хотел бы изменить его на что-то подобное, но не знаю, как, потому что он требует пустой одинарной кавычки символ, и я не уверен, если это разрешено.

snprintf(myFilePath, 
      sizeof(myFilePath), 
      "%s%c%s", 
      workingDir, 
      (lastChar == CHAR_BACKSLASH) ? '' : CHAR_BACKSLASH, 
      "myfile.txt"); 
+0

Первый случай более ясен относительно того, что это за намерение. Последний случай менее ясен, и очень вероятно, что snprintf является лишь слегка скотчем при обработке символов, чем строки одной длины. Оптимизация не стоит недостатка в удобочитаемости. –

+0

Что делать, если я изменил его на использование «\\» для ясности, а не на шестнадцатеричном коде во всех случаях? – Lakey

+0

У вас есть хороший момент. Я изменил его на использование определения (CHAR_BACKSLASH) для ясности, вместо шестнадцатеричного кода для обратной косой черты – Lakey

ответ

2

Почему бы и нет? Тогда вам не нужно беспокоиться о том, является ли «действительным случаем для% c. И snprintf имеет один менее вагг для обработки.

snprintf(myFilePath, 
     sizeof(myFilePath), 
     (lastChar == '\\') ? "%s%s" : "%s\\%s" 
     workingDir, 
     "myfile.txt"); 
+0

Мне нравится это решение. Я не думал о том, чтобы делать тернарный оператор в самой строке формата. Умная! – Lakey