Простое форматирование строки C ++ под GCC - PullRequest
1 голос
/ 15 июня 2011

Я конвертирую чужую библиотеку C ++ для работы в GCC ( Xcode ).Каков основной метод форматирования строк?

РЕДАКТИРОВАТЬ: я вижу, первоначальная формулировка моего вопроса вызвало много путаницы, не говоря уже о некотором развлечении.Что мне нужно сделать, это заменить некоторые функции форматирования строк в их библиотеке.Они выполнили форматирование с помощью wxString, которое я не хочу включать в свой проект - я знаю, что оно существует для XCode, но это похоже на подход кувалдой для простого форматирования, которое мне нужно сделать.У них есть функции, которые берут свои объекты и выплевывают строки - обычно (char *), и мне нужно создать такие же (char *) выходные данные [которые затем могут перейти к другому объекту в библиотеке;не обязательно для пользователя], но делайте это так, чтобы не использовать wxString.И я бы предпочел не превращать его в C ++.В Objective-C я делаю это все время с помощью метода NSString stringWithFormat :.Очевидно, я не хочу использовать какие-либо методы NSString и не хочу создавать строки NSString.Создание строк (char *) или C ++ было бы хорошо.И нет, это не ложный факт, и это не домашняя работа.

Ответы [ 4 ]

5 голосов
/ 15 июня 2011

Вы можете использовать потоки:

std::stringstream ss;

ss << somedouble << someint;
2 голосов
/ 15 июня 2011

Вы можете использовать семейство функций printf, но в 99,99% случаев это вызывает неодобрение по очень веской причине.

См. Ответ Тони Тигра.


редактировать: хорошо. Почему хмурится на строки формата.

  • Как вы печатаете свои собственные типы или типы из какой-либо сторонней библиотеки C ++? В отличие от printf, потоки расширяемы:

    cout << foo << '\n';

    против

    printf ("%s: %f %f %f / scc(%d)\n", 
     foo.name(), 
     foo.height(), foo.width(), foo.depth(),
     foo.sampleCount());
  • дерьмо, передача не POD-типов в varargs приводит к неопределенному поведению; угадайте, какой тип возврата foo.name()? Как ни странно, он прекрасно компилируется и, в зависимости от реализации, может даже работать по какой-то странной причине.

  • Через некоторое время я начинаю использовать свою собственную не примитивную реализацию Decimal, которая будет использоваться в качестве возвращаемого типа foo.width()/height()/depth(). Дерьмо дерьмо, теперь я вызываю неопределенное поведение 4 раза только в этой строке.

  • Как избежать избыточности форматной строки? Должен ли я выводить из печати, как это:

printf("foo is:"); 
   printFoo (stdout); 
   printf("\n");
  • наконец, у меня был плохой день и плохая ночь. Я набираю: float f; fscanf(stdout, "%c %f", f); -> Пожалуйста, найдите все ошибки.
1 голос
/ 15 июня 2011

Есть много способов сделать это в C ++. Например:

char str[256];
snprintf (str, sizeof (str), "%g %d %s", someDouble, someInteger, someString);

Вы также можете печатать напрямую в некоторый выходной поток, использовать потоки ввода-вывода C ++, даже до степени Boost.LexicalCast .

1 голос
/ 15 июня 2011

sprintf() - хорошая отправная точка.Тем не менее, это действительно зависит от того, чего вы не хотите достичь.std::stringstream - хорошая альтернатива, как указывает Тони Тигр, Boost.Format - это другое.

...