Есть ли способ указать, сколько символов строки нужно распечатать с помощью printf ()?

127

Есть ли способ указать, сколько символов строки нужно распечатать (аналогично десятичным разрядам в ints)?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

Хотел бы распечатать: Here are the first 8 chars: A string

ТТТ
источник

Ответы:

226

Основной способ:

printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

Другой, часто более полезный способ:

printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");

Здесь вы указываете длину в качестве аргумента int функции printf (), которая обрабатывает '*' в формате как запрос на получение длины из аргумента.

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

printf ("Here are the first 8 chars: %*.*s\n",
        8, 8, "A string that is more than 8 chars");

Это также аналогично обозначению "% 8.8s", но опять же позволяет вам указать минимальную и максимальную длину во время выполнения - более реалистично в таком сценарии, как:

printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);

Спецификация POSIX printf()определяет эти механизмы.

Джонатан Леффлер
источник
2
К последнему примеру: что, если скопированная строка короче minlen?
Искатель правды
4
Вывод будет заполнен пустыми полями (слева, если вы не добавите a -), чтобы довести его до полной указанной длины.
Джонатан Леффлер
13
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

% 8s будет указывать минимальную ширину 8 символов. Вы хотите усечь до 8, поэтому используйте% .8s.

Если вы хотите всегда печатать ровно 8 символов, вы можете использовать% 8.8s

developmentalinsanity
источник
13

Помимо указания фиксированного количества символов, вы также можете использовать, *что означает, что printf принимает количество символов из аргумента:

#include <stdio.h>

int main(int argc, char *argv[])
{
        const char hello[] = "Hello world";
        printf("message: '%.3s'\n", hello);
        printf("message: '%.*s'\n", 3, hello);
        printf("message: '%.*s'\n", 5, hello);
        return 0;
}

Печать:

message: 'Hel'
message: 'Hel'
message: 'Hello'
hlovdal
источник
11

Используя printfвы можете сделать

printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

Если вы используете C ++, вы можете добиться того же результата с помощью STL:

using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;

Или менее эффективно:

cout << "Here are the first 8 chars: " <<
        string(s.begin(), s.begin() + 8) << endl;
Питер Александр
источник
1
Примечание: не используйте ostream_iterator<char>(cout)! Вместо этого используйте ostreambuf_iterator<char>(cout)! Разница в производительности должна быть достаточно большой.
Дитмар Кюль
Путь более эффективно использовать вместо: std::cout.write(s.data(), 8). Или в современном C ++ std::cout << std::string_view{s.data(), 8}.
Artyer
4

Выведите первые четыре символа:

printf("%.4s\n", "A string that is more than 8 chars");

См. Эту ссылку для получения дополнительной информации (проверьте .precision -section)

Анси
источник
4

В C ++ это просто.

std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));

РЕДАКТИРОВАТЬ: также безопаснее использовать это со строковыми итераторами, чтобы не сбежать с конца. Я не уверен, что происходит с printf и слишком короткими строками, но я думаю, это может быть безопаснее.

Крис Х
источник
32
ха, да это "легко". C ++ всегда выглядит как автомобильная авария.
Президент Джеймс К. Полк
вы все еще можете использовать printf () в c ++ :)
StasM
6
Я думаю, это был сарказм. std::cout << someStr.substr(0,8);гораздо очевиднее.
MSalters,
2
@MSalters Вы должны опубликовать это как ответ.
Джонатан Ми,
1

В C ++ я делаю это так:

char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;

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

rodolk
источник