结果在 运行 反向字符串程序时停止工作
results in stopped working when running reverse string program
I wrote the function to reverse a string in c++ but it results in "stopped working".
#include<iostream>
#include<string.h>
using namespace std;
string reverse(string s1)
{
string s2;
for(int i=0;i<s1.length();i++)s2[i]=s1[s1.length()-i-1];
return s2;
}
int main()
{
string s1,s2;
cin>>s1;
s2=reverse(s1);
cout<<s2;
}
What can be the problem?
问题是您在其边界之外访问字符串 s2。您只能访问已存在的带有 [] 的字符;尝试在字符串之外写入会导致未定义的行为。
一种可能的解决方案是预分配 s2:
string s2 = s1;
另一种选择是对s1进行倒计时,然后简单地在s2的末尾添加新的字符。
如果您没有使用标准算法,问题几乎总是出在您没有使用标准算法上。
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
std::string reverse(const std::string& s)
{
std::string result;
result.reserve(s.size());
std::copy(s.rbegin(), s.rend(), std::back_inserter(result));
return result;
}
int main()
{
auto s = std::string("Hello, World");
auto s2 = reverse(s);
std::cout << s << std::endl;
std::cout << s2 << std::endl;
return 0;
}
预期结果:
Hello, World
dlroW ,olleH
s2
没有明确定义的长度:您假设它的长度至少与 s1
相同。具体来说,s2[i]
的行为是 undefined.
考虑基于 C++ 标准库的解决方案
std::string s2(s1);
std::reverse(s2.begin(), s2.end());
从概念上讲,我将字符串视为 char
s.Using 标准函数的 容器 意味着查看您的代码的人知道 正是你在做什么。
当字符串还没有形成时,你不能索引它。
如下更正您的代码并附加到 s2
而不是索引到它
string reverse(string s1)
{
string s2;
for (int i = 0; i<s1.length(); i++)
s2 += s1[s1.length() - i - 1];
return s2;
}
函数声明有一个缺点。首先,实际上它不会反转字符串。它以相反的顺序复制字符串。
此外,将参数声明为常量引用更有效。
例如
std::string reverse_copy( const std::string &s );
在函数中,您正在使用应用于 ampty 字符串的下标运算符
string s2; // the string is empty
for(int i=0;i<s1.length();i++)s2[i]=s1[s1.length()-i-1];
^^^^^
这会导致未定义的行为。
另外,最好使用 std::string::size_type
类型的索引,而不是 int
类型的索引。
可以在没有任何显式循环的情况下编写函数。例如
std::string reverse_copy( const std::string &s );
{
return std::string( s.rbegin(), s.rend() );
}
如果你想使用循环,那么函数可以看起来像
std::string reverse_copy( const std::string &s );
{
std::string t;
t.reserve( s.size() );
for ( auto i = s.size(); i != 0; --i ) t.push_back( s[i-1] );
return t;
}
代替语句
t.push_back( s[i-1] );
你也可以写
t += s[i-1];
例如
std::string reverse_copy( const std::string &s );
{
std::string t;
t.reserve( s.size() );
for ( auto i = s.size(); i != 0; --i ) t += s[i-1];
return t;
}
I wrote the function to reverse a string in c++ but it results in "stopped working".
#include<iostream>
#include<string.h>
using namespace std;
string reverse(string s1)
{
string s2;
for(int i=0;i<s1.length();i++)s2[i]=s1[s1.length()-i-1];
return s2;
}
int main()
{
string s1,s2;
cin>>s1;
s2=reverse(s1);
cout<<s2;
}
What can be the problem?
问题是您在其边界之外访问字符串 s2。您只能访问已存在的带有 [] 的字符;尝试在字符串之外写入会导致未定义的行为。
一种可能的解决方案是预分配 s2:
string s2 = s1;
另一种选择是对s1进行倒计时,然后简单地在s2的末尾添加新的字符。
如果您没有使用标准算法,问题几乎总是出在您没有使用标准算法上。
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
std::string reverse(const std::string& s)
{
std::string result;
result.reserve(s.size());
std::copy(s.rbegin(), s.rend(), std::back_inserter(result));
return result;
}
int main()
{
auto s = std::string("Hello, World");
auto s2 = reverse(s);
std::cout << s << std::endl;
std::cout << s2 << std::endl;
return 0;
}
预期结果:
Hello, World
dlroW ,olleH
s2
没有明确定义的长度:您假设它的长度至少与 s1
相同。具体来说,s2[i]
的行为是 undefined.
考虑基于 C++ 标准库的解决方案
std::string s2(s1);
std::reverse(s2.begin(), s2.end());
从概念上讲,我将字符串视为 char
s.Using 标准函数的 容器 意味着查看您的代码的人知道 正是你在做什么。
当字符串还没有形成时,你不能索引它。
如下更正您的代码并附加到 s2
而不是索引到它
string reverse(string s1)
{
string s2;
for (int i = 0; i<s1.length(); i++)
s2 += s1[s1.length() - i - 1];
return s2;
}
函数声明有一个缺点。首先,实际上它不会反转字符串。它以相反的顺序复制字符串。
此外,将参数声明为常量引用更有效。
例如
std::string reverse_copy( const std::string &s );
在函数中,您正在使用应用于 ampty 字符串的下标运算符
string s2; // the string is empty
for(int i=0;i<s1.length();i++)s2[i]=s1[s1.length()-i-1];
^^^^^
这会导致未定义的行为。
另外,最好使用 std::string::size_type
类型的索引,而不是 int
类型的索引。
可以在没有任何显式循环的情况下编写函数。例如
std::string reverse_copy( const std::string &s );
{
return std::string( s.rbegin(), s.rend() );
}
如果你想使用循环,那么函数可以看起来像
std::string reverse_copy( const std::string &s );
{
std::string t;
t.reserve( s.size() );
for ( auto i = s.size(); i != 0; --i ) t.push_back( s[i-1] );
return t;
}
代替语句
t.push_back( s[i-1] );
你也可以写
t += s[i-1];
例如
std::string reverse_copy( const std::string &s );
{
std::string t;
t.reserve( s.size() );
for ( auto i = s.size(); i != 0; --i ) t += s[i-1];
return t;
}