输入大小为1的字符串时出现分段错误

问题描述 投票:0回答:1

当我传递大小为1的字符串作为输入时,我遇到了分段错误(内核已转储)。我尝试搜索原因,但找不到任何原因,要求我调试程序。通过调试,我意识到在读取大小为1的字符串时会引发分段错误。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int main()
{
    ll t,x,y;
    string s;
    cin>>t;
    while(t--){
        cin>>s;
        int tilt=0;
        for(int i=s.length()-1,j=0;i>=s.length()/2;i--,j++){
            if(s[i]!=s[j]){
                tilt = s[i]>s[j]?-1:1;
                s[i]=s[j];
            }
        }
        if(tilt==-1 || tilt==0){
            if(s.length()%2==0){
                y=1;x=s.length()/2-1;
                while(y!=0 && x>=0){
                    if(s[x]=='9'){
                        s[x]='0';
                    }else{
                        s[x] += 1;
                        y=0;
                    }
                    x--;
                }
                if(y==0){
                    for(int i=0;i<s.length()/2;i++){
                        cout<<s[i];
                    }
                    for(int i=s.length()/2-1;i>=0;i--){
                        cout<<s[i];
                    }
                    cout<<endl;
                }else{
                    cout<<1;
                    for(int i=0;i<s.length()/2;i++){
                        cout<<s[i];
                    }
                    for(int i=s.length()/2-2;i>=0;i--){
                        cout<<s[i];
                    }
                    cout<<1<<endl;
                }
            }else{
                y=1;x=s.length()/2;
                while(y!=0 && x>=0){
                    if(s[x]=='9'){
                        s[x]='0';
                    }else{
                        s[x] += 1;
                        y=0;
                    }
                    x--;
                }
                if(y==0){
                    for(int i=0;i<s.length()/2;i++){
                        cout<<s[i];
                    }
                    for(int i=s.length()/2;i>=0;i--){
                        cout<<s[i];
                    }
                    cout<<endl;
                }else{
                    cout<<1;
                    for(int i=0;i<s.length()/2;i++){
                        cout<<s[i];
                    }
                    for(int i=s.length()/2-1;i>=0;i--){
                        cout<<s[i];
                    }
                    cout<<1<<endl;
                }
            }
        }else{
            cout<<s<<endl;
        }
    }
    return 0;
}

输入:1个11输出:22

输入:1个1个输出:错误

问题:https://www.spoj.com/problems/PALIN/

c++ segmentation-fault palindrome
1个回答
0
投票

这里

for(int i=s.length()-1,j=0;i>=s.length()/2;i--,j++){

s的大小为1时,s.length()/2是值为[0]的无符号数量。将整数与无符号进行比较时,在比较之前,该整数将转换为无符号。检查无符号值> = 0始终为true,因此这是无限循环。这就是它崩溃的原因。

我希望您的编译器向您提供有关有符号/无符号比较危险的警告。

这是修复此特定循环的一种方法,但我想您可能在代码的其他地方也遇到类似的问题。

for (size_t i = s.length(), j = 0; i > s.length()/2; ++j) {
    --i;
    if (s[i] != s[j]) {
        tilt = s[i] > s[j] ? -1 : 1;
        s[i] = s[j];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.