Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++ 字符串用作参数时是否会更改常量字符*_C++_String - Fatal编程技术网

C++ 字符串用作参数时是否会更改常量字符*

C++ 字符串用作参数时是否会更改常量字符*,c++,string,C++,String,奇怪的是,构造函数字符串(const char*s)有时会改变const char*中的字符。我有一个简单的方法,检查是否设置了一个标志,以某种方式改变字符串,搜索树并返回一个值。如果我只使用字符串,它似乎工作得很好;然而,由于一些奇怪的原因,当我使用从另一个函数接收的const char*作为参数输入函数时,我返回的const char*有时返回不完整。这就是我直到最近才找到的细微错误的原因。如果我在方法内部创建另一个字符串并将字符串参数附加到新字符串中,这似乎是可行的,但这似乎是解决此问题的

奇怪的是,构造函数字符串(const char*s)有时会改变const char*中的字符。我有一个简单的方法,检查是否设置了一个标志,以某种方式改变字符串,搜索树并返回一个值。如果我只使用字符串,它似乎工作得很好;然而,由于一些奇怪的原因,当我使用从另一个函数接收的const char*作为参数输入函数时,我返回的const char*有时返回不完整。这就是我直到最近才找到的细微错误的原因。如果我在方法内部创建另一个字符串并将字符串参数附加到新字符串中,这似乎是可行的,但这似乎是解决此问题的错误方法。我相信这可能是对正确使用构造函数的误解,有人对这个微妙的问题有什么见解吗

作为一个简单的示例,终端返回以下结果,请注意,不完整字符的符号没有正确复制,而是为空

编辑:
@T.C.
我决不会责怪字符串类T.C.,我很清楚这是我的错误,我正试图理解这个问题。这很可能是对std::string类中构造函数的使用的误解。一点背景故事我正在一起使用C/C++和java进行实践。我创建了一个类,它似乎通过了C++中的最小测试,并创建了一个包装器,以便我可以在C中使用它。然而,据我所知,std::string应该复制字符,尽管我不确定。我知道,人们会告诉我,只使用C++,而不是混合在两个答案中的其他问题,当个人混合这两个,但任何方向都将被赞赏。 我本来想把问题简短一点,但在添加代码之前就发布了。附件是它的一个使用片段和一个丢失字符符号的正确图片,我以前找不到

LZW.c(c类)

ctrie.cpp(C包装类)

。。。
//返回值
int Trie_int_get(Trie_int*t,const char*key){return((Trie*)t)->get(key)}
...
//在TST中查找并返回s的最长前缀
const char*Trie_Int_longestPrefix(Trie_Int*t,const char*s){return((Trie*)t)->longestPrefix(s).c_str();}
...
Trie.ii(C++类)

。。。
模板
值Trie::get(std::string键,const bool&ignoreCase)const{
if(key.empty()){throw std::invalid_参数(“key必须具有长度>=1”);}
if(ignoreCase)uu toLowerCase(key);
三节点*x=get(根,键,0,ignoreCase);
返回x!=nullptr?x->val:deffal;
}
模板
std::string Trie::longestPrefix(std::string key,const bool&ignoreCase)const{
…有点长
}
...
模板
std::string Trie::longestPrefix(
std::string key,const bool&ignoreCase)const;
//在TST中查找并返回s的最长前缀
常量字符*Trie_Int_longestPrefix(Trie_Int*t,常量字符*s)
{return((Trie*)t)->longestPrefix(s).c_str();}
当函数返回一个类类型(直接,而不是对类型的引用)时,调用该函数将创建一个临时类对象,该对象将一直存在到调用它的完整表达式结束。(最常见的“充分表达”是一种陈述,就像在本例中一样。)

std::string::c_str()
返回一个c字符串指针,该指针保证在调用
字符串的任何非常量成员(包括析构函数)之前有效

因此,
Trie\u Int\u longestprifix
函数返回一个已经无效的指针,任何使用它的行为都被视为未定义的行为

在您的测试运行中,无效指针指向的内存在您第一次打印它时碰巧仍然包含一些“预期”数据。但到了第二次,其他一些代码显然已将该内存区域重新用于其他用途。

template
std::string Trie::longestPrefix(
std::字符串键,常量bool和ignoreCase)常量;
//在TST中查找并返回s的最长前缀
常量字符*Trie_Int_longestPrefix(Trie_Int*t,常量字符*s)
{return((Trie*)t)->longestPrefix(s).c_str();}
当函数返回一个类类型(直接,而不是对类型的引用)时,调用该函数将创建一个临时类对象,该对象将一直存在到调用它的完整表达式结束。(最常见的“充分表达”是一种陈述,就像在本例中一样。)

std::string::c_str()
返回一个c字符串指针,该指针保证在调用
字符串的任何非常量成员(包括析构函数)之前有效

因此,
Trie\u Int\u longestprifix
函数返回一个已经无效的指针,任何使用它的行为都被视为未定义的行为


在您的测试运行中,无效指针指向的内存在您第一次打印它时碰巧仍然包含一些“预期”数据。但是到了第二次,其他一些代码显然已将该内存区域重新用于其他用途。

可能与
字符串无关,而与代码的其他部分有关。请发布显示问题的代码。您的代码中存在错误。如果您想帮助识别bug,您必须发布一个小的、自包含的示例来重现问题。代码的一个特点是……您知道,它是代码,您不必描述它,您可以显示实际的代码。贴一个小,复制该问题的自包含示例。@T.C.我从未说过string类存在问题,如果认为该问题是其他任何一个错误,那会有点令人讨厌,但我自己的问题可能与
string
无关,与代码的其他部分无关。请发布显示该问题的代码。您可以你的代码中有一个bug。你必须发布一个小型的、独立的考试
...
const char * tex = Trie_Int_longestPrefix(trie,input); //Find max prefix match tex
printf("%25s\t",tex);
//FOR SOME REASON TEX CHANGES AFTER THIS CALL
arr[size++] = Trie_Int_get(trie,tex);   //Add encoding 
printf("%25s\n",tex);
int t = strlen(tex);
...
...
//Return Value
int Trie_Int_get(Trie_Int * t,const char * key){return ((Trie<int> *)t)->get(key); }
...
//Find and return longest prefix of s in TST
const char * Trie_Int_longestPrefix(Trie_Int * t,const char * s){return  ((Trie<int> *)t)->longestPrefix(s).c_str();}
...
...
template<typename value>
value Trie<value>::get(std::string key,const bool & ignoreCase) const {
    if(key.empty()){throw std::invalid_argument("key must have length >= 1");}
    if(ignoreCase)__toLowerCase(key);
    TrieNode* x = get(root,key,0,ignoreCase);
    return x!=nullptr? x->val : defVal;
}
template<typename value>
std::string Trie<value>::longestPrefix(std::string key,const bool & ignoreCase) const{
...Kind of Long
}
...
template<typename value>
std::string Trie<value>::longestPrefix(
    std::string key,const bool & ignoreCase) const;

//Find and return longest prefix of s in TST
const char * Trie_Int_longestPrefix(Trie_Int * t,const char * s)
{return  ((Trie<int> *)t)->longestPrefix(s).c_str();}