Есть ли способ указать, сколько символов строки будет распечатываться с помощью printf()?
Есть ли способ указать, сколько символов строки будет распечатываться (похоже на десятичные знаки в int
s)?
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
Ответы
Ответ 1
Основной способ:
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);
Ответ 2
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
% 8s укажет минимальную ширину 8 символов. Вы хотите усечь на 8, поэтому используйте%.8s.
Если вы хотите всегда печатать ровно 8 символов, вы можете использовать% 8.8s
Ответ 3
Используя printf
, вы можете сделать
printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
Если вы используете С++, вы можете добиться того же результата с помощью 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;
Ответ 4
Помимо указания фиксированного количества символов, вы также можете использовать *
, что означает, что 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'
Ответ 5
Печать первых четырех символов:
printf("%.4s\n", "A string that is more than 8 chars");
Подробнее см. эту ссылку (проверьте .precision-section)
Ответ 6
Е (..... "%. 8s" )
Ответ 7
В С++ это легко.
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
EDIT:
Также безопаснее использовать это с итераторами строк, поэтому вы не сбегаете с конца. Я не уверен, что происходит с printf и строкой, которые слишком коротки, но я думаю, что это может быть безопаснее.
Ответ 8
В С++ я делаю это следующим образом:
char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;
Обратите внимание, что это небезопасно, потому что при передаче второго аргумента я могу выйти за пределы размера строки и вызвать нарушение доступа к памяти. Вы должны выполнить свою собственную проверку, чтобы избежать этого.