Новые форумы для: пользователей, администраторов, математиков и филологов.
2

Здравствуйте.

Вопрос: есть ли способ вывести строку без ведущих пробелов, используя исключительно printf()? То есть без предварительного ее изменения и вообще без какого-либо лишнего кода, вроде по-буквенного вывода?

Зачем оно мне? - перевожу приложение, в котором к исходной строке прибавляется какое-то неизвестное кол-во пробелов и из-за этого она ужасно выглядит в русской локализации. Доступ имею только к строке формата, вроде "Param: %@, another param:%s, ...".
Спасибо.

UPD.
Забыл уточнить:

строка формата: " %@ %@ KB %@ %@";
на выходе: "______Software Update_____28 471 KB____3_files" (где "_" это пробел).
Т.е. где-то в коде есть макрос вида LocalizedFormat(format, __VA_ARGS__), где format - та самая строка формата (берется из внешнего файла, который я редактирую).

задан 21 Фев 5:26

VioLet's gravatar image

VioLet
1.3k110
50% принятых

закрыт 24 Фев 14:34

1

Увы, нету такого. Если не нарушает красоту (таблицы, допустим), то можно вывод обрабатывать на предмет подчистки, напр: yourgreatprogramm | sed -e 's,\s\+, ,g'

(21 Фев 6:12) alexlz

Очень жаль. Просто мне дана только сама строка формата, которая подставляется в уже работающее приложение. Ну и приложение GUI'йное, так что никакой пост-обработки (printf() написал, так как используется сходная система форматирования).

(21 Фев 6:31) VioLet
1

Достаточно просто передать указатель на первый символ-не-пробел.

(21 Фев 20:44) mikillskegg
1

Или используя "find_first_of" из библиотеки string.

(21 Фев 20:51) Asen

@mikillskegg & @Asen ... имея доступ только к содержимому форматной строки.

(21 Фев 21:19) alexlz

В вопросе говорится о неизвестном количестве пробелов. Интересно, откуда они берутся ?

Или все таки в каждом из форматов разное, но определенное количество пробелов в начале ? Если второе, то интересно, как отреагирует GUI, если заменить их на '\r' (возврат каретки) ? Или (если пробелов в формате нет) в начало выводимого текста '\r' добавить, или несколько '\b' ...

--

Автор, а приведите несколько форматов и Ваших текстов, которые по ним печатаются. Может, что путное в голову придет.

(21 Фев 21:44) avp

Ну если гуй отрабатывает backspace, то кто его знает.

(21 Фев 22:39) alexlz

Я попробовал в GnomeTerminal ubuntu и в консоли виндоуз '\r' в начале текста, выводимого по формату "%40s", т.е. текст позиционируется вправо в поле из 40 символов.

Так вот, все перед '\r' исчезает, текст после '\r' выводится с начала строки.

Попробуйте.

(22 Фев 0:32) avp

Впервые вижу '@' в C форматах, как символ редактирования. Вы уверены, что форматирование не производится какой-то собственной функцией, по неизвестным нам правилам ?

(22 Фев 11:24) avp

@avp это Objective-C, а %@ - тип для строковых объектов. Правила известны - такие же как у printf().

(22 Фев 15:44) VioLet

Возможно, помогут уязвимости, то есть передача выполнения кода на сторону.

(22 Фев 15:51) cool

@cool это несколько не мой случай - все, что я могу сделать - это как-то изменить саму строку формата. Да и то, это будет костыль, но пока разработчик не торопится что-то менять, так что этот вариант был бы неплох.

(22 Фев 16:15) VioLet

В C printf("==%10s==",XAXA); выведет

==      XAXA==

а printf("==%-10s==",XAXA); выведет

==XAXA      ==

Могу лишь (по аналогии) предложить попробовать заменить %@ на %-@.

К сожалению, с Objective-C не знаком, попробовать не на чем.

(22 Фев 23:17) avp
1

@avp увы, не работает. Видимо, придется все таки ждать фиксов от разработчика.
Спасибо всем за советы.

(23 Фев 8:44) VioLet
показано 5 из 14 показать еще 9

Вопрос был закрыт. Причина - "Вопрос исчерпан.". Закрывший - VioLet 24 Фев 14:34

0

Насколько правильно я понял вашу задачу, то могу посоветовать сделать так:

...
#include<string>
...
int main()
{
    string str("     sdfsdf sdfsdf  213123      sfd");
    string::size_type i;
    i = str.find_first_not_of(" ");
    str = str.substr(i);
    cout << str << endl;
}
ссылка

отвечен 23 Фев 9:03

Asen's gravatar image

Asen
1.4k115

изменен 8 Мар 14:43

%D0%A5%D1%8D%D1%88%D0%9A%D0%BE%D0%B4's gravatar image

ХэшКод
5.4k427

Браво! Но если у него не получится, может быть Вы сами это сделаете? Разницы-то никакой, что на C++ играть, что в вувузелы дуть.

(23 Фев 9:27) alexlz

"есть ли способ вывести строку без ведущих пробелов, используя исключительно printf()....без предварительного ее изменения..".

(23 Фев 10:06) VioLet

А можно задать(ненавязчивый!) вопрос? А почему именно "printf()" ?

(23 Фев 10:20) Asen

Потому что в нем используется точно такая же система форматирования текста при выводе.

(23 Фев 10:25) VioLet
0

@VioLet, увы-увы... увы лимит комментариев исчерпал. Поэтому в ответе не ответ, а одна идея (догадка) по поводу Вашей проблемы.

Если Вы делаете русский текст в кодировке UTF-8, а программа форматирования по @ не знает о многобайтных кодировках, то она может рассчитывать размер выходного поля по количеству байт выводимой строки (объекта). Отсюда и пробелы.

В этом случае можно попробовать однобайтную кодировку русского языка (cp1251, iso8859-5 или koi8-r) и должным образом описать локализацию. Например (для *nix) попробовать export LANG=...

Или что-то иное, но в направлении управления кодировкой.

ссылка

отвечен 23 Фев 20:12

avp's gravatar image

avp
6.5k111

Да нет, что вы, пробелы специально подставляются приложением, чтобы сделать "красивый" по-колоночный вывод в текстовое поле.

(24 Фев 5:04) VioLet

Сочувствую. Переводить а английского на русский с сохранением длины текста -- просто развлечение для мазохистов.

(24 Фев 5:17) alexlz

@alexlz Ладно бы еще одно это. Так нужно еще конструкцию "XX file/files" превратить в "файлов: ХХ". Из-за одного этого вся таблица летит к чертям. Ну а использовать "XX файл(-а/-ов)" не хочется..

(24 Фев 5:32) VioLet

Теперь все понятно. Без переделки приложения (возможности редактирования как форматов, так и текстов сообщений) не обойтись.

(24 Фев 11:51) avp

@avp И тексты переводить можно, но да, вы правы, выглядит это все убого. Еще раз спасибо всем, закрываю вопрос.

(24 Фев 14:33) VioLet
Если вы не нашли ответ, задайте вопрос.

Здравствуйте

ХэшКод - это совместно редактируемый форум вопросов и ответов для начинающих и опытных программистов.

Присоединяйтесь!

отмечен:

×473
×34
×1

задан
21 Фев 5:26

показан
213 раз

обновлен
8 Мар 14:43

Отслеживать вопрос

по почте:

Зарегистрировавшись, вы сможете подписаться на любые обновления

по RSS:

Ответы

Ответы и Комментарии