如何在C+;中处理字符串时使用memset+;? 我来自Python背景,最近学习C++。我正在学习一个名为memset的C/C++函数,并遵循网站上的在线示例,在该示例中我发现了一些编译错误: /** *@author:Bhishan Poudel *@file:a02_memset_geeks.cpp *@created:2019年6月5日星期三美国东部时间11:07:03 * *参考: */ #包括 #包括 #包括 使用名称空间std; int main(int argc,char*argv[]){ char str[]=“geeksforgeks”; //memset(str,“t”,sizeof(str)); memset(str,'t',sizeof(str)); 库特
使用单引号“t”时出错。这将打印额外字符如何在C+;中处理字符串时使用memset+;? 我来自Python背景,最近学习C++。我正在学习一个名为memset的C/C++函数,并遵循网站上的在线示例,在该示例中我发现了一些编译错误: /** *@author:Bhishan Poudel *@file:a02_memset_geeks.cpp *@created:2019年6月5日星期三美国东部时间11:07:03 * *参考: */ #包括 #包括 #包括 使用名称空间std; int main(int argc,char*argv[]){ char str[]=“geeksforgeks”; //memset(str,“t”,sizeof(str)); memset(str,'t',sizeof(str)); 库特,c++,string,initialization,string-literals,memset,C++,String,Initialization,String Literals,Memset,使用单引号“t”时出错。这将打印额外字符 tttttttttttttt!R@` 那是因为你重写了空终止符 不过,终止符是数组大小的一部分(数组不是魔法) 我想你的意思是: memset(str, 't', strlen(str)); // ^^^^^^ 使用带双引号的“t”时出错 完全不同。你告诉计算机把字符串中的每个字符都设置成一个字符串。没有意义;无法编译 如何在C++中使用MeMSET?< /P> 不要 使用类型安全的std::fill,并结合std::
tttttttttttttt!R@`
那是因为你重写了空终止符
不过,终止符是数组大小的一部分(数组不是魔法)
我想你的意思是:
memset(str, 't', strlen(str));
// ^^^^^^
使用带双引号的“t”时出错 完全不同。你告诉计算机把字符串中的每个字符都设置成一个字符串。没有意义;无法编译
如何在C++中使用MeMSET?< /P> 不要 使用类型安全的
std::fill
,并结合std::begin
和std::end
:
std::fill(std::begin(str), std::end(str)-1, 't');
(如果您担心性能,请不要担心:这只会在可能的情况下通过模板专业化委托给memset
,不需要优化,而不会牺牲类型安全性;)
或者只是一个std::string
开头。这个声明
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;
std::cout << str << '\n';
std::cout.write( str, sizeof( str ) ) << '\n';
然后,第二个参数的类型(即类型const char*
)与类型为int
的第二个函数参数的类型不对应。请参见函数的声明
void * memset ( void * ptr, int value, size_t num );
因此,编译器会发出错误消息
除了字符数组(即使在C++中也经常使用)之外,还可以使用模拟字符串的标准类std::string
(或std::basic_string
)
在这种情况下,不需要使用标准C函数memset来用单个字符填充字符串
#include <iostream>
#include <string>
int main()
{
std::string s( "geeksforgeeks" );
s.assign( s.length(), 't' );
std::cout << s << '\n';
}
或
或
#包括
#包括
int main()
{
std::字符串s(“geeksforgeks”);
s、 替换(std::begin(s)、std::end(s)、s.length(),'t');
std::cout这是memset的正确语法
void* memset( void* dest, int ch, std::size_t count );
将值ch转换为无符号字符,并将其复制到dest指向的对象的第一个计数字符中。如果对象是可能重叠的子对象或不可普通复制(例如,标量、C兼容结构或可普通复制类型的数组),行为未定义。如果计数大于dest指向的对象的大小,则行为未定义
()
对于第一个语法memset(str,'t',sizeof(str));
。编译器抱怨太大了。它打印了18次tttttttt!R@
。我建议对char数组使用sizeof(str)-1
对于第二种语法memset(str,“t”,sizeof(str))
您提供的第二个参数是字符串。这就是编译器抱怨错误的原因:从“const char*”到“int”的转换无效。Vlad已经帮助回答了您问题的第一部分,但我觉得第二部分可以更直观地解释:
正如其他人所提到的,'t'
是一个字符,而“t”
是一个字符串,字符串的末尾有一个空终止符。这使得“t”
不是一个而是两个字符的数组-['t','\0']
!这使得memset的错误更加直观-它可以很容易地将单个char
强制为int
,但是当它被给定一个char
数组时,它会阻塞。就像在Python中一样,int(['t','\0'])
(或者ord(['t','\0'])
)不会计算。“t”大多数的在线学习资源都是垃圾,而且网站也不例外,试试这个例子:为什么在C++中使用“代码> MyStase<代码>?C++的函数存在的原因是向后压缩性。它是一个装满子弹的枪,你瞄准了你的左脚,扣动了扳机。你必须要有一个A。我是对的。你不应该在回答问题的人下面更改问题。如果你接受了一条评论或回答,但它仍然不起作用,你可以问另一个问题,但是这种编辑,用一个问题替换另一个问题,是破坏性的。不幸的是,在最初的示例中,它实际上是sizeof
。遗憾的是这样的编辑E用于“教”C++:(@ Atas123)是从一本好书中工作的另一个原因。C++中有不同的文字,这与Python完全不同。应该永远被禁止。@astro123:从geeksforgeks.org/memset-in-cpp在线学习这是你的第一个问题。这个教程在它的小例子中有一个严重的错误。这在geeksforgeks.org上并不罕见。有一些好的东西,但它经常与坏的东西混合在一起,直到你已经是一个专家,你才知道如何告诉dif引用。与堆栈溢出不同,Geeksforgeks没有投票机制让人们查看帖子并指出其质量,因此你无法知道哪些帖子值得信任。@PeterCordes很遗憾,文档就这样做了……显然需要经过投票、策划的教程。我相信有人会找到正确的答案最终是t设计。原始帖子清楚地表明用户是t
memset(str, "t", sizeof(str));
void * memset ( void * ptr, int value, size_t num );
#include <iostream>
#include <string>
int main()
{
std::string s( "geeksforgeeks" );
s.assign( s.length(), 't' );
std::cout << s << '\n';
}
#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';
}
#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';
}
#include <iostream>
#include <string>
int main()
{
std::string s( "geeksforgeeks" );
s.replace( 0, s.length(), s.length(), 't' );
std::cout << s << '\n';
}
#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';
}
void* memset( void* dest, int ch, std::size_t count );