无法在 C++20 中将 std::cin 与 char* 或 char[] 一起使用

2024-02-20

It used上班:阅读std::cin到动态分配的chararray - 或作为参数传入的数组(请参阅下面的 MCVE)。

#include <iostream>

void read (char str[256]) //or omit the # between the []'s -- no difference
{
    std::cin >> str; //error
}

int main ()
{
    char  s1 [256];
    char* s2 = new char[256];
    char  s3 [256];

    std::cin >> s1;   //OK
    std::cin >> s2;   //error
    read (s3);       

    return 0;
}

我相信问题出在 C++20 更新上。其目的是为了防止std::cin从溢出它正在读入的字符串,并且 cppreference.com 确实列出了新的原型 https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2 for std::istream's operator>>现在有CharT (&s)[N] , not CharT* s,作为论证。

确认:此 MCVE 适用于 g++ 10(不支持此功能),并且适用于使用 Default 作为语言标志的 Visual Studio;但使用/std:c++latest,VS抱怨:

binary '>>': no operator found which takes a right-hand operand of type 'char *' (or there is no acceptable conversion) 

所以我完全理解编译器的抱怨。但我该如何使用std::cin使用数组作为参数传入,还是动态数组?

(另外:当准备好读取时,C++ 如何知道数组是动态创建的还是静态创建的?它不应该在声明后能够区分!)


但是如何将 cin 与作为参数传入的数组或动态数组一起使用?

不。如果您有一个 char 数组,请给它 char 数组,例如

void read (char (&str)[256]) // now we have a reference to an array, so we know its size
{
    std::cin >> str;
}

// or if we don't care about the size, we just want an array

template <std::size_t N>
void read (char (&str)[N]) // now we have a reference to an array, so we know its size
{
    std::cin >> str;
}

如果您有动态大小,请使用std::string仍然适用于cin

void read (std::string& str)
{
    std::cin >> str;
}

(另外:当准备好读取时,C++ 如何知道数组是动态创建的还是静态创建的?它不应该在声明后能够区分!)

这并不是说它知道它已准备好读取,而是它知道它可以读取的大小。当你给它一个指针时,它只需相信指针指向足够的内存。如果你给它一个数组,通过引用传递数组,那么编译器就知道它可以读取的大小,因为数组的大小是类型信息的一部分,与指针不同。不要将数组的退化为指针与数组作为指针混淆。他们是两个不同的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 C++20 中将 std::cin 与 char* 或 char[] 一起使用 的相关文章

  • 使用 CLion 进行 OpenCV Windows 设置

    我想在 Windows 上为 CLion IDE 设置 OpenCV 我尝试使用 OpenCV 3 1 和 2 4 得到相同的结果 我有 Windows 10 64 位 CLion 使用 cygwin 环境 到目前为止我做了什么 1 从Op
  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • 为什么我的 d3 力导向图不显示边缘?

    我使用 d3 创建了一个简单的力导向图 http goo gl afHTD http goo gl afHTD 为什么图表的边缘不显示 这是我的整个 HTML 文件 当然 您也可以通过在我的链接页面上查看源代码来查看它并修改它 它基于 d3
  • 使用错误的表别名生成查询的原则

    我正在尝试做一个简单的 gt find 使用原则 规则 2 5 1 查询非常简单 this gt get order repository gt find 10 但这会生成一个复杂的查询 选择 s0 number AS number 0 s
  • SYSTEM_HANDLE_INFORMATION结构

    这个结构从何而来 我知道它是在著名的 ntdll h 中声明的 并且是未记录的 Windows API 的一部分 但不同版本的windows之间不是有差异吗 有没有办法从工作系统中转储这个结构 我在 Windbg 中尝试了 dt SYSTE
  • 如何复制内存

    说我有 unsigned char varA varB varC varA malloc 64 varB malloc 32 varC malloc 32 我怎样才能把first将 32 字节的 varA 放入 varB 中last32字节
  • 编写带有垂直标题的 HTML 表格的最常见方法? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您编写具有垂直标题的 HTML 表格的首选方式是什么 通过垂直标题我的意思是表格有标题 th 标签位于左侧 通常 Header 1数据数据数据
  • 最大连续数

    我正在练习两个指针技术来解决最大连续数 LeetCode https leetcode com problems max consecutive ones 给定一个二进制数组 找出该数组中连续 1 的最大数量 示例1 Input 1 1 0
  • Html-Webpack-Plugin 模板:模块构建失败:SyntaxError:意外的标记

    当我尝试使用 index ejs 模板文件使用 html webpack plugin 进行构建时 会引发以下错误 即使我尝试加载为 html 文件或安装 ejs loader 仍然失败 我不确定 ejs loader 是否与 html w
  • mysql 错误 2002 (HY000): 无法通过套接字 '/var/run/mysqld/mysqld.sock' 连接到本地 MySQL 服务器 (2)

    我使用 在 Ubuntu 13 上 安装了 MYSQL sudo apt get install mysql 但跑完之后 mysql u root p 然后输入密码就会出现错误 ERROR 2002 HY000 无法通过套接字连接到本地 M
  • 在Python中初始化二维数组

    我在 python 中初始化二维数组时遇到问题 我想要一个 6x6 阵列 我做到了 arr None 6 6 但是当我这样做时 gt gt gt arr 1 2 10 gt gt gt arr None None 10 None None
  • 电子邮件中的 URL 是否已被搜索引擎索引,以便可以公开搜索?

    我在这里阅读了一些有关电子邮件客户端预取电子邮件中的 URL 的问题 对此的答案似乎是添加一个新的确认页面 用户必须在其中单击按钮来确认所需的操作 But this https stackoverflow com a 42147812 11
  • 外键到底是什么?

    好的 所以我知道数据库中的主键是什么 如果数据库中有一个表 则主键是表中每一行唯一的单个值 例如 id name whatever 1 Alice 2 Bob 45 Eve 988 所以我需要一个好的 简单的例子来解释外键到底是什么 因为我
  • 仅使用单精度浮点近似 [0,pi] 上的余弦

    我目前正在研究余弦的近似值 由于最终的目标设备是自行开发的 32 位浮点 ALU LU 并且有专门的 C 编译器 因此我无法使用 C 库数学函数 cosf 我的目标是编写在准确性和指令 周期数量方面有所不同的各种方法 我已经尝试过很多不同的
  • 空对象的条件类型

    是否有可能有一个条件类型可以测试可以为空的对象 例如 function test
  • 如何将我自己的代码/函数和外部java库添加到azure函数应用程序

    我编写了一些代码来在代码运行时创建一个文件 我的计划是按照定期计划将其放在 Microsoft Azure 函数应用程序上 因此它每小时或每天运行一次 我将使用计时器触发器并在那里也有一个 HTTP 请求触发器进行测试 但是 我不知道在哪里
  • 计算 C 中一致字符串的数量

    所以这是 leetcode 的一个问题 我遇到了一些问题 我已经看到解决这个问题的代码发布到 leetcode 的讨论部分 但我想知道是否有人可以帮助我解决这个问题我已经写过的代码 这就是问题所在 给你一个字符串allowed由不同的字符和
  • Visual Studio:针对私有和内部成员缺少 XML 文档发出警告

    我正在使用 Visual Studio 2005 VS 8 0 并且我希望强制执行所有类成员 而不仅仅是公共成员 都被记录的要求 虽然设置 Visual Studio 在公共 受保护或内部受保护成员未记录时生成警告很简单 但我正在寻找一种方
  • Cygwin 中的 .seh_savexmm 寄存器无效

    制作 我曾使用 cygwin 但遇到编译错误 我不确定 seh savexmm 的无效寄存器是什么 请帮我 我在谷歌上搜索了这个问题但没有找到 问题很多 但没有灵魂 请帮我 perl generate functions pl file o
  • 如何在 VSCode 中使用 yapf(或 black)

    我使用以下命令安装了 yapf conda install yapf 并在我的中添加下一行 vscode settings json file python linting pylintEnabled true python linting
  • 使用 Firebase 云功能实现发送电子邮件

    对于我们的网络应用程序 我们目前使用 Firebase 的免费计划 并且需要发送有关各种事件 触发器的电子邮件 问题是 我认为 Mailgun 及其云功能可以完美地完成此任务 但看起来只能将其 API 与 Firebase 的付费计划一起使
  • 无法在 C++20 中将 std::cin 与 char* 或 char[] 一起使用

    It used上班 阅读std cin到动态分配的chararray 或作为参数传入的数组 请参阅下面的 MCVE include