假设我有一个 const char*,我想用 std::cout 打印它,但是我只想打印前 X 个字符。有没有办法告诉 std::cout 这一点?(不插入字符串终止符或制作临时副本。)
C++ 17 introduces string_view
#include <string_view>
#include <iostream>
char message[] = { "my long char message" };
int length = some_number;
int main() {
string_view str(message);
std::cout << str.substr(0, length) << std::endl;
}
我没有尝试编译上述代码。string_view
基本上是一个字符串,除了它不“拥有”其内容(在使用后不会删除内部指针)。
std::cout<<std::string_view(message, length)
,不需要在这里创建两个 stringviews。 - MSaltersstring_view
是一种将任何现有内存视为 string
的方法(无论该内存实际包含的是字符串数据与否都不重要;如果您愿意,可以将 u32string_view
插入到 32 位值数组中以操作它们,就好像它们是字符一样)。然而,在使用 string_view
时需要小心:如果它正在查看的内存超出作用域或被释放,事情会很快变得糟糕。虽然在这种用法中这不太可能成为问题,但值得记住。 - bionicOnion我不知道 std::cout
是否有这样的功能,但你可以看一下 printf()
,这里有一个例子 here。
例如:
printf ("The 8 chars: %*.*s\n", min, max, "String that you want to limit");
#define CROPPED_STRING(str, len) ( (str.size() <= len) ? (str) : (str.substr(0, len)) )
并且这样使用:
std::cout << CROPPED_STRING("Hello World", 7) << std::cout;
这段代码显示 Hello W
。
可选地,您可以添加对 len
的控制以确保它大于0。
str.substr(0, len)
就足够了。 - Benjamin Barroischar[N]
和std::string
的常见类型是std::string
。 - MSaltersconst char*
,而不是一个std::string
。 - YSC
std::basic_ostream::write()
是C++标准库中用于向输出流写入连续字节块的函数。它接受两个参数:指向要写入的内存区域的指针和要写入的字节数。这个函数不会在输出中添加任何分隔符或空格位,也不会执行任何格式化或转换操作。 - Yksisarvinenwrite()
or loop through one character at a timefor (size_t i = 0; i < length; ++i) cout << buf[i];
- KamilCukstd::string_view
。 - Jarod42strlen(yourstring)>=X ?
吗?它是写入 最多 X 个字符还是 恰好 X 个字符? - MSalters