有没有办法指定一个string使用printf()打印出多less个字符?

有没有办法指定一个string打印出多less字符(类似于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

基本的方法是:

 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 ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars"); 

%8s将指定最less8个字符的宽度。 你想在8截断,所以使用%.8s。

如果你想总是打印8个字符,你可以使用%8.8s

使用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("%.4s\n", "A string that is more than 8 chars");

查看此链接了解更多信息(请查阅.precision -section)

除了指定固定数量的字符外,还可以使用*表示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(….. “%。787-8”)

在C ++中很容易。

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

编辑:这与string迭代器一起使用也是比较安全的,所以你不会跑到最后。 我不确定printf和string会发生什么,但是我猜这可能会更安全。

在C ++中,我这样做:

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

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