C++ - 在打印char*时指定std::cout的最大字符数

8

假设我有一个 const char*,我想用 std::cout 打印它,但是我只想打印前 X 个字符。有没有办法告诉 std::cout 这一点?(不插入字符串终止符或制作临时副本。)


8
std::basic_ostream::write()是C++标准库中用于向输出流写入连续字节块的函数。它接受两个参数:指向要写入的内存区域的指针和要写入的字节数。这个函数不会在输出中添加任何分隔符或空格位,也不会执行任何格式化或转换操作。 - Yksisarvinen
1
write() or loop through one character at a time for (size_t i = 0; i < length; ++i) cout << buf[i]; - KamilCuk
1
你也可以使用std::string_view - Jarod42
你确定 strlen(yourstring)>=X ? 吗?它是写入 最多 X 个字符还是 恰好 X 个字符? - MSalters
3个回答

7

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基本上是一个字符串,除了它不“拥有”其内容(在使用后不会删除内部指针)。


1
或者直接使用 std::cout<<std::string_view(message, length),不需要在这里创建两个 stringviews。 - MSalters
为了让这更加生动:string_view 是一种将任何现有内存视为 string 的方法(无论该内存实际包含的是字符串数据与否都不重要;如果您愿意,可以将 u32string_view 插入到 32 位值数组中以操作它们,就好像它们是字符一样)。然而,在使用 string_view 时需要小心:如果它正在查看的内存超出作用域或被释放,事情会很快变得糟糕。虽然在这种用法中这不太可能成为问题,但值得记住。 - bionicOnion

0

我不知道 std::cout 是否有这样的功能,但你可以看一下 printf(),这里有一个例子 here

例如:

printf ("The 8 chars: %*.*s\n", min, max, "String that you want to limit");

你应该展示如何在这个回答中使用它,以使其更好。将信息放在链接后面,会使这个回答不那么有用,如果链接失效了,那么读者就会感到无助。 - NathanOliver

-3
如果您想要与任何标准兼容,可以编写一个简单的宏:
#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。


1
其实我认为你甚至不需要检查,str.substr(0, len) 就足够了。 - Benjamin Barrois
如果字符串太长,这将创建一个副本,但不适用于需要(另一个)副本的“char *”。 - François Andrieux
说真的,宏定义?@FrançoisAndrieux:如果字符串很短,它也会复制。char[N]std::string的常见类型是std::string - MSalters
1
OP得到了一个const char*,而不是一个std::string - YSC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接