Ошибка сегментации при вводе строки размером 1 - PullRequest
0 голосов
/ 30 марта 2020

Я получаю ошибку сегментации (ядро сброшено), когда я передаю строку размера 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 * ​​1004 *

Вход: 1 1 Выход: Ошибка

Вопрос: https://www.spoj.com/problems/PALIN/

1 Ответ

0 голосов
/ 30 марта 2020

Здесь

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

, когда s имеет размер 1, s.length()/2 представляет собой unsigned количество со значением 0. При сравнении целого числа без знака, целое число равно перед сравнением преобразуется в неподписанное. Проверка, является ли значение без знака> = 0, всегда истинно, так что это бесконечное значение l oop. Вот почему это дает сбой.

Я надеюсь, что ваш компилятор предупредит вас об опасностях сравнения со знаком и без знака.

Вот один из способов исправить это конкретное l oop, но я ' Я предполагаю, что у вас есть подобные проблемы в других местах вашего кода.

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];
    }
}

Несколько советов

  • Используйте size_t для индексных переменных.
  • Когда цикл в обратном направлении будет очень осторожно относясь к условию завершения, я делаю так, чтобы переменная была больше, чем она должна быть, и уменьшала ее в начале l oop вместо конца. Таким образом, вы сравниваете с >, а не >= и избегаете проблем, с которыми сталкивается ваш код.
  • Попробуйте использовать в своем коде пробелы. Это облегчает чтение для всех, включая вас.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...