有没有一种方法可以指定使用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

Answers:


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");

在这里,您将长度指定为printf()的int参数,该参数将格式中的'*'视为从参数获取长度的请求。

您还可以使用表示法:

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
输出将进行空白填充(除非添加,否则将在左侧填充-)以使其达到指定的完整长度。
乔纳森·莱夫勒

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


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'

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)!性能上的差异应该很大。
DietmarKühl'17

改为更有效地使用: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和string太短会发生什么,但是我猜这可能更安全。


32
哈,是的,这很“容易”。C ++总是看起来像车祸。
总统詹姆斯·波尔克(James K. Polk)2010年

您仍然可以在c ++中执行printf():)
StasM 2010年

6
我认为这很讽刺。std::cout << someStr.substr(0,8);更明显。
MSalters 2010年

2
@MSalters您应该将其发布为答案。
乔纳森·米


1

在C ++中,我以这种方式执行此操作:

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

请注意,这是不安全的,因为在传递第二个参数时,我可能会超出字符串的大小并产生内存访问冲突。您必须实施自己的检查来避免这种情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.