Ошибка в цикле, удаляющем пробелы

252
01 марта 2017, 22:02

Есть код, который выявляет, является ли фраза или слово палиндромом, есть такой код

#include "stdafx.h"
#include "locale.h"
#include <iostream>
#include "windows.h"
using namespace std;
char slovo[80], prov[80] = { 0 };
int t = 0, i = 0, a, z=0, o=0;
char* netprobelam(char *slovo)
{
    do
    {
        if (slovo[z] == ' ') {
            o = z;
            z--;
            do
            {
                slovo[o] = slovo[o + 1];
            } while (slovo[o] != '\0');
        }
        z++;
    } while (slovo[z] != '\0');
    return slovo;
}
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Russian");
    cin >> slovo;
    do
    {
        t++;
    } while (slovo[t] != '\0');
    a = t;
    t = a - 1;
    netprobelam(slovo);
    system("pause");
    do
    {
        prov[i] = slovo[t];
        i++;
        t--;
    } while (t != -1);
    t = 0;
    i = i - 1;
    do
    {
        t++;
        i--;
    } while (slovo[t] == prov[i]);
    if ((t - 1) == a)
    {
        cout << "Выполняется\n";
    }
    else
    {
        cout << "Не выполняется\n";
    }
    system("pause");
}

проблема в том, что функция не заменяет все буквы на следующие, а лишь обрубает слово до первого пробела, прошу помощи.

Answer 1
cin >> slovo;

работает именно так - до первого пробела. Попробуйте getline

 getline(cin, slovo);

только slovo сделайте string, а не массив.

Ну, или

cin.getline(slovo,80);

если нужен именно массив.

P.S. Но, откровенно говоря, код надо бы переписывать, как говорится, от слова "совсем"...

Например, так:

bool isPalindrome(const char * s)
{
    for(const char * b = s, *e = b + strlen(s) - 1; b <= e; ++b, --e)
    {
        while(*b == ' ') ++b;
        while(*e == ' ') --e;
        if (*b != *e) return false;
    }
    return true;
}

int main(int argc, const char * argv[])
{
    string s;
    getline(cin,s);
    cout << "\"" << s << "\" is "
        << (isPalindrome(s.c_str()) ? "" : "not ") << "palindrome\n";
}
READ ALSO
Реализация функции at для char C++

Реализация функции at для char C++

Помогите ,пожалуйста, реализовать близкую реализацию функции at()У меня существует класс для хранения массива типа char и мне нужно реализовать...

292
uncaught target signal 11 в qemu для arm при сборке с помощью arm-none-eabi-g++

uncaught target signal 11 в qemu для arm при сборке с помощью arm-none-eabi-g++

Мне необходимо скомпилировать и запустить простейший код на C++ под ARMПытаюсь сделать:

291
Повторное удаление указателя

Повторное удаление указателя

При вызове конструктора копий указатели ссылаются на один и тот же указательИ при вызове деструктора повторное удаление указателя

249
Тривиальное хеширование [требует правки]

Тривиальное хеширование [требует правки]

Доброго времени суток! Можете привести пример тривиального хеширования? В интернете не смогла найти никакой понятной информации

570