Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在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 - Fatal编程技术网

如何在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+;中处理字符串时使用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::

使用单引号“t”时出错。这将打印额外字符

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 );