有没有一种方法可以指定使用 printf()打印多少个字符串?

有没有一种方法可以指定一个字符串要打印多少个字符(类似于 int中的小数位) ?

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

150064 次浏览

Printf (... ... “% .8 s”)

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

% 8将指定最小宽度为8个字符。您希望截断8个字符,因此使用% 8。

如果希望总是精确地打印8个字符,可以使用% 8.8 s

在 C + + 中很容易。

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

编辑: 与字符串迭代器一起使用它也更安全,这样就不会运行到结束。我不确定 printf 和 string 太短会发生什么,但我想这可能更安全。

基本方法是:

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.8 s”表示法,但同样允许您在运行时指定最小和最大长度——在下面的场景中更为实际:

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

printf()的 POSIX 规范定义了这些机制。

使用 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;

除了指定固定数量的字符,您还可以使用 *,这意味着 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'

打印前四个字符:

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

有关更多信息,请参见 这个链接(检查。精度-部分)

在 C + + 中,我是这样做的:

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

请注意,这是不安全的,因为当传递第二个参数时,我可以超出字符串的大小,并生成一个内存访问冲突。为了避免这种情况,您必须执行自己的检查。