передать весь строковый объект в качестве аргумента в классе заголовочного файла в C ++ - PullRequest
0 голосов
/ 25 марта 2020

Я пытался создать программу, в которой я изучал, как использовать заголовочный файл, и я столкнулся с проблемой

salt.h

#pragma once
#include<string>
class salting {

public:
    char encrypt(std::string&);
    char decrypt(std::string&);
};

salt. cpp

#include "salt.h"
#include<iostream>

char salting::encrypt(std::string& s)
{
    size_t i = 0;
    std::cout << s;

    if (s[0] % 2 == 0) {       //shows an error of exception unhandled std::out of range
        for (char cl : s) {
            if (i % 2 != 0 && i > 2) {
                cl++;
                s.at(i) = cl;
            }
            i++;
        }
    }
    else {
        for (char cl : s) {
            if (i % 2 == 0 && i > 2) {
                cl++;
                s.at(i) = cl;
            }
            i++;
        }
    }
    return 'c';
}

char salting::decrypt(std::string& s)
{
    size_t i = 0;
    if (s.at(0) % 2 == 0) {         //shows an error of exception unhandled std::out of range
        for (char cl : s) {
            if (i % 2 != 0 && i > 2) {
                cl--;
                s.at(i) = cl;
            }
            i++;
        }
    }
    else {
        for (char cl : s) {
            if (i % 2 == 0 && i > 2) {
                cl--;
                s.at(i) = cl;
            }
            i++;
        }
    }
    return'c';
}

test. cpp

#include<iostream>
#include "salt.h"

using namespace std;

int main() {
    salting l;
    string s1 {};
    cout << "enter the string to encrypt: ";
    cin.ignore('\n',INT_MAX);
    s1.clear();
    getline(cin, s1);


    l.encrypt(s1);
    cout << endl << "the salted string is: " << s1;


    l.decrypt(s1);
    cout << endl << "the original string is: " << s1;

}

Я не знаю, что происходит, так как я все еще учусь программированию, я могу утверждать, что функция getline принимает ввод, после которого ничего не происходит но после того, как я нажимаю ввод 2-3 раза, он показывает: "Необработанное исключение в 0x76804192 в тестовом code.exe: исключение Microsoft C ++: std :: out_of_range в ячейке памяти 0x003AF704" . Рядом с комментарием, который я вставил в salt. cpp, после чего, если я нажимаю countinue, он показывает: "Ошибка проверки времени выполнения # 0 - значение ESP не было должным образом сохранено при вызове функции. Обычно это результат вызова функции, объявленной с помощью одно соглашение о вызовах с указателем на функцию, объявленное с другим соглашением о вызовах. " Заранее спасибо.

1 Ответ

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

Вот ваш код, несколько уменьшенный для иллюстрации проблемы

#include <iostream>
#include <string>

void f(std::string s) {
    if (s.size() < 1)
        std::cout << "s[0] would correctly throw out_of_range exception" << std::endl;
}

int main()
{
    std::string s;
    (std::cin).ignore('\n', INT_MAX);
    getline(std::cin, s);
    std::cout << s.size() << std::endl;
    f(s);
}

Я настроил его для работы с вводом, перенаправленным из файла sample.txt со следующей строкой

short

Вывод

0 с [0] правильно выдает исключение out_of_range

Просмотр документации http://www.cplusplus.com/reference/istream/istream/ignore/

istream& ignore (streamsize n = 1, int delim = EOF);

Значение, которое вы передали n, равно '\ n', то есть символ 10 (в ascii), поэтому вы сказали ему игнорировать 10 символов, как предыдущий комментарий сказал. Поэтому, когда он читает ввод из 5 символов, игнорирование пропускает все это, не оставляя ничего для чтения getline. Это, в свою очередь, приводит к исключению вне диапазона, когда вы пытаетесь посмотреть на s [0], который на самом деле находится вне диапазона.

Если вы проверяете s.size () в функции, то Вы можете не смотреть на s [0]. Просто вернись немедленно, может быть? Ваши функции всегда должны безопасно обрабатывать непредвиденные вводы, такие как пустая строка.

Если вы закомментируете игнорирование, тогда вы прочтете полный ввод и получите то, что ожидали, предполагая, что введенный вами вклад был именно тем, что вы хотели. По крайней мере, это то, что происходит в моей сборке.

Если вы не получаете ввод от getline, могут быть и другие вещи, о которых вы не сообщили нам в своем коде, например, в c ++ getline () не ждет ввода от консоли при многократном вызове или Постоянное чтение двух строк с использованием функции getline в c ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...