有没有办法指定要打印的字符串的字符数(类似于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
答案 0 :(得分:191)
基本方法是:
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");
在这里,您将length指定为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);
printf()
的POSIX规范定义了这些机制。
答案 1 :(得分:10)
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
%8s将指定最小宽度为8个字符。您希望截断为8,因此请使用%.8s。
如果您想要始终打印8个字符,则可以使用%8.8s
答案 2 :(得分:9)
使用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;
答案 3 :(得分:8)
除了指定固定数量的字符外,您还可以使用*
,这意味着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'
答案 4 :(得分:3)
在C ++中很容易。
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
编辑: 使用字符串迭代器也更安全,因此不要运行结束。我不确定printf和string会发生什么变得太短,但我猜这可能更安全。
答案 5 :(得分:3)
打印前四个字符:
printf("%.4s\n", "A string that is more than 8 chars");
有关详细信息,请参阅this link(请参阅.precision -section)
答案 6 :(得分:2)
的printf(..... “%。787-8”)
答案 7 :(得分:0)
在C ++中,我这样做:
char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;
请注意这是不安全的,因为在传递第二个参数时,我可以超出字符串的大小并生成内存访问冲突。你必须实施自己的检查以避免这种情况。