在 C++ 中处理字符串时如何使用 memset? [关闭]

2024-04-17

我有Python背景,最近在学习C++。我正在学习一个名为的 C/C++ 函数memset并遵循网站上的在线示例https://www.geeksforgeeks.org/memset-in-cpp/ https://www.geeksforgeeks.org/memset-in-cpp/我遇到一些编译错误:

/**
 * @author      : Bhishan Poudel
 * @file        : a02_memset_geeks.cpp
 * @created     : Wednesday Jun 05, 2019 11:07:03 EDT
 * 
 * Ref: 
 */

#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]){
    char str[] = "geeksforgeeks";

    //memset(str, "t", sizeof(str));
    memset(str, 't', sizeof(str));

    cout << str << endl;

    return 0;
}

使用单引号 't' 时出错
这会打印额外的字符。

tttttttttttttt!R@`

使用带有双引号的“t”时出错

$ g++ -std=c++11 a02_memset_geeks.cpp 
a02_memset_geeks.cpp:17:5: error: no matching function for call to 'memset'
    memset(str, "t", sizeof(str));
    ^~~~~~
/usr/include/string.h:74:7: note: candidate function not viable: no known
      conversion from 'const char [2]' to 'int' for 2nd argument
void    *memset(void *, int, size_t);
         ^
1 error generated.

如何在C++中使用memset?

进一步研究
优秀的教程,有缺点memset在这里给出:https://web.archive.org/web/20170702122030/https:/augias.org/paercebal/tech_doc/doc.en/cp.memset_is_evil.html https://web.archive.org/web/20170702122030/https:/augias.org/paercebal/tech_doc/doc.en/cp.memset_is_evil.html


本声明

char str[] = "geeksforgeeks";

声明一个字符数组,其中包含一个字符串,该字符串是包含终止零符号的字符序列'\0'.

您可以用以下等效方式想象声明

char str[] = 
{ 
    'g', 'e', 'e', 'k', 's', 'f', 'o', 'r', 'g', 'e', 'e', 'k', 's', '\0'
};

这个函数的调用memset

memset(str, 't', sizeof(str));

覆盖数组的所有字符,包括终止零。

所以接下来的声明

cout << str << endl;

导致未定义的行为,因为它输出字符直到遇到终止零。

你可以写

#include <iostream>
#include <cstring>

int main()
{
    char str[] = "geeksforgeeks";

    std::memset( str, 't', sizeof( str ) - 1 );
    
    std::cout << str << '\n';
}

或者通过以下方式

#include <iostream>
#include <cstring>

int main()
{
    char str[] = "geeksforgeeks";

    std::memset( str, 't', std::strlen( str ) );
    
    std::cout << str << '\n';
}

即保持数组中的终止零不变。

如果您想覆盖数组的所有字符(包括终止零),那么您应该替换此语句

std::cout << str << '\n';

对于这个声明

std::cout.write( str, sizeof( str ) ) << '\n';

正如下面的程序所示,因为数组现在不包含字符串。

#include <iostream>
#include <cstring>

int main()
{
    char str[] = "geeksforgeeks";

    std::memset( str, 't', sizeof( str ) );
    
    std::cout.write( str, sizeof( str ) ) << '\n';
}

至于这个电话

memset(str, "t", sizeof(str));

然后是第二个参数的类型(即类型const char *) 与具有以下类型的第二个函数参数的类型不对应int。查看函数的声明

void * memset ( void * ptr, int value, size_t num );

因此编译器会发出错误消息。

除了字符数组(即使在 C++ 中也经常使用)之外,您还可以使用标准类std::string (or std::basic_string) 模拟字符串。

在这种情况下,无需使用标准 C 函数 memset 来用单个字符填充字符串。最简单的方法如下

#include <iostream>
#include <string>

int main()
{
    std::string s( "geeksforgeeks" );
    
    s.assign( s.length(), 't' );
    
    std::cout << s << '\n';
}

另一种方法是使用标准算法std::fill or std::fill_n在标头中声明<algorithm>。例如

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    std::string s( "geeksforgeeks" );
    
    std::fill( std::begin( s ), std::end( s ), 't' );
    
    std::cout << s << '\n';
}

or

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    std::string s( "geeksforgeeks" );
    
    std::fill_n( std::begin( s ), s.length(), 't' );
    
    std::cout << s << '\n';
}

你甚至可以使用该方法replace班级的std::string以下方式之一

#include <iostream>
#include <string>

int main()
{
    std::string s( "geeksforgeeks" );
    
    s.replace( 0, s.length(), s.length(), 't' );
    
    std::cout << s << '\n';
}

Or

#include <iostream>
#include <string>

int main()
{
    std::string s( "geeksforgeeks" );
    
    s.replace( std::begin( s ), std::end( s ), s.length(), 't' );
    
    std::cout << s << '\n';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中处理字符串时如何使用 memset? [关闭] 的相关文章

  • 电话号码的正则表达式,不允许全零

    需要您的正则表达式帮助 我当前的正则表达式是 d 8 最小长度为 8 不允许包含字母 特殊字符和空格 我还想禁止全零 如 00000000 Thanks 该模式应该可以满足您的需求 0 d 8 The 0 部分是负前瞻 将阻止仅输入零 Ex
  • SharpZipLib - 将文件夹/目录添加到 zip 存档

    通过示例 我很好地掌握了如何提取 zip 文件 几乎在每个示例中 识别 ZipEntry 是否为目录的方法如下 string directoryName Path GetDirectoryName theEntry Name string
  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 用户控件内所有控件均为空

    我有一个 UserControl 它使用 UserControl 以及其他控件 In the ascx文件我有以下代码
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 系统错误 124 - SHFileOperation 的 ERROR_INVALID_LEVEL

    我在使用时遇到问题SHFileOperation SHFileOperation SHFILEOPSTRUCT https stackoverflow com questions 9191415 shfileoperation shfile
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat

随机推荐

  • 警告:尝试多次加载角度。角JS

    我试图在运行 Grunt Build 后查看我的应用程序 我使用 gruntserve dist 来查看所有生产就绪的构建 但在浏览器中我得到一个无限循环 警告 尝试多次加载角度 我读到发生这种情况是因为 TemplateURL 连接后可能
  • 警告:非法字符串偏移“名称”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试制作一个产品插入页面 以便我可以将产品插入数据库 然后将它们显示在产品页面中 但是当我单击 添加产品 按钮时 出现以下错
  • pandas 数据框中的圆形浮点列

    我有以下熊猫数据框 Y X id WP NER 0 35 973496 2 734554 1 WP 01 1 35 592138 2 903913 2 WP 02 2 35 329853 3 391070 3 WP 03 3 35 3926
  • C#6 中的长字符串插值行不支持 Tab、CR 和 LF

    我尝试在 C 6 中使用制表符进行字符串插值 var name My Name var text t t name 它工作正常 制表符 t 已解决 当尝试使用时长字符串插值线 https stackoverflow com question
  • 具有数据属性的 JQuery UI 工具提示

    我正在尝试使用 HTML5 数据属性来存储和显示工具提示的内容 我使用 JQuery UI 作为工具提示 我已阅读文档 但尚未弄清楚如何对正确的选择器进行编程并显示自定义数据 对我所缺少的有什么想法吗 http jsfiddle net Q
  • 如何在 Symfony2 控制器中获取用户 IP 地址?

    我需要在提交表单后将评论用户的 IP 地址存储在数据库中 symfony2有没有获取IP的函数 或者有其他方法获取IP吗 您可以使用 Request 服务获取客户端 IP container gt get request gt getCli
  • 如何在开始日期的时间戳中添加秒数,以便获得估计的结束日期?

    我有一个带有 start time 和估计时间 以秒为单位 的任务对象 start time 以 MYSQL DATETIME 形式存储在数据库中 估计时间以秒形式存储 我想将秒数添加到 start time 以获得估计的完成日期 内维尔提
  • 安全地存储访问令牌

    我应该采取哪些安全措施来确保 如果我的数据库受到损害 长寿命访问令牌不会被盗 长寿命访问令牌与特定服务的用户名和密码一样好 但从与其他人的交谈看来 大多数人 包括我自己 都以纯文本形式存储访问令牌 这似乎与以纯文本形式存储密码一样糟糕 显然
  • 我的 QFileSystemModel 在 PyQt 中无法按预期工作

    EDIT2 model hasChildren parentIndex 回报True but model rowCount parentIndex 回报0 QFileSystemModel 只是 PyQt 中的 fubar 吗 EDIT 经
  • 使用 MQL5 将 OHLC 值从 Python API 集成到 MT5

    我已经从 iqoption 获得了 OHLC 值 并试图找到一种将其与 MT5 一起使用的方法 这是我获取这些值的方法 import time from iqoptionapi stable api import IQ Option I w
  • SSRS 可以根据导出类型切换标题可见性吗? 2008-R2

    我熟悉基于变量或参数值动态显示 隐藏其他报表对象 文本框 tablix 列等 但有没有办法用标题来做到这一点 我在标题对象上没有看到任何 可见性 选项卡来设置表达式 此外 有没有办法根据导出样式隐藏标题 例如 我想在导出到 PDF 时显示标
  • 在 Haskell 中的列表上编写递归函数

    我有以下问题 定义函数 and or Bool gt Bool 它给出了布尔值列表的合取和析取 例如 and False True False or False True True 在空列表上and gives True and or gi
  • 使用 CSS Mix-Blend-Modes 进行隔离:如何防止元素与父元素混合

    我已经尝试了很多不同的方法 但无法使 pink 和 green div 相互混合 但不能使父元素 wrapper 的背景颜色混合 wrapper background color blue height 100vh width 100 is
  • Python中的三角波形状数组

    生成 100 个数字组成的数组 形成下面三角波的形状 最大 最小幅度为 0 5 的最有效方法是什么 记住三角波形 生成三角波的最简单方法是使用 signal sawtooth 请注意 signal sawtooth phi width 接受
  • 如何将数据传回 Ionic 2 中的根页面?

    我有一个 Ionic 2 应用程序 该应用程序的前提是上课 一旦课程被打开 用户就会被标记为在远程 API 中学习该课程 数据流向为 用户打开 课程 选项卡 应用程序从 API 请求 类 数据 每个类别都拥有该用户的 状态 用户选择一个类别
  • UITableView 分隔符样式“单线蚀刻”无法正常工作

    我的代码中有一个分组的 UITableView 并且正在尝试使单线蚀刻样式正常工作 其底部有 1px 白色阴影 相反 当我启用它时 我会在顶部看到一种负灰色阴影 编程实现和 IB 实现都不会产生 1 px 阴影 以下是带有负灰色阴影的屏幕截
  • macOS 上的 Bash - 获取给定年份每个星期六的日期列表

    In bash on macOS 我想写一个小脚本dates 或任何其他可以做的程序 它给我一个格式的日期列表yyyymmdd给定年份的每个星期六并将其保存到变量中 例如 如果我想要 1850 年所有星期六的日期列表 它应该看起来像这样 v
  • 通过 REST API 将对象添加到 Firebase 时如何设置我们自己的 Key

    我使用以下方法将对象添加到 Firebase 数据库 url https myfb firebaseio com api types ty packs json ch curl init curl setopt ch CURLOPT URL
  • 懒惰的 juxt 函数有什么优点吗?

    在回答中一个问题 https stackoverflow com questions 10044254 is there a reverse map function关于一个使用相同参数映射多个函数的函数 A juxt 我想出了一个基本上采
  • 在 C++ 中处理字符串时如何使用 memset? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我有Python背景 最近在学习C 我正在学习一个名为的 C C 函数memset并遵循网站上的在线示例https www gee