为什么我在这段代码中出现分段错误.

Why am i getting segmentation fault in this code ?

本文关键字:错误 分段 代码 段代码 为什么      更新时间:2023-10-16

我正在尝试在hackerrank上做这个问题:

https://www.hackerrank.com/challenges/funny-string/copy-from/17051736输入字符串的大小应该从 1 到 10,000 不等,但是当我提交此代码时,它在测试用例 #7,8 和 9 中显示分段错误。
但是当我使用 char 数组数据类型而不是逻辑相同的字符串数据类型时,所有测试用例都毫无问题地通过。
为什么会这样?字符串数据类型不应该能够存储 10,000 个字符就好了吗?

#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
using namespace std;
int main()
{
string S,R;
int T,i,j,flag,size;
cin>>T;
cin.ignore();
while(T--)
{
    cin>>S;
    for(i=S.size()-1,j=0;i>=0;--i,++j)
        R[j]=S[i];
    size=S.size();
    for(i=1,flag=1;i<size;++i)
    {
        if( abs(S[i]-S[i-1]) != abs(R[i]-R[i-1]) ) 
        {
            flag=0;
            break;
        }
    }
    if(flag==1)
        cout<<"Funny"<<endl;
    else
        cout<<"Not Funny"<<endl;
}
return 0;
}

in

for(i=S.size()-1,j=0;i>=0;--i,++j)
    R[j]=S[i];

R[j]对任何j都无效,因为R的大小为零。

如果你想RS相反,那么你可以使用

std::string R(S.rbegin(), s.rend());
//or
R.assign(S.rbegin(), s.rend());

由于我不能作为新手发表评论:为什么不从末尾索引 S 作为获取 R 的快速方法?比较 S[i-1] - S[i] 与 S[n-i] - S[n-i-1]以 n 为长度。只需要找出循环结束的中间位置,否则您最终会得到最大比较的两倍。