2017-01-26 9 views
0

Я пишу программу, которая выполняет простое вращение (думаю, как rot13) в строке, взятой из пользовательского ввода. Моя проблема в том, что я хочу каждый раз менять каждый символ в значении ASCII строки различной суммой - и поэтому я использую цикл for для прохождения строки и вызывая функцию, которая каждый раз генерирует случайное число. Тем не менее, я хочу, чтобы иметь возможность вернуть это число, чтобы я мог «расшифровать» строку позже. Очевидно, мне также нужно вернуть строку.Возвращение двух значений двух разных типов в функции C++

Вот мой код:

int ranFunction() 
{ 

    int number = rand() % 31; 
    return number; 

} 

string rotFunction(string words) 
{ 
    int upper_A = 65; 
    int lower_z = 122; 
    int rand_int = 0; 

    for (int i = 0; i < words.length(); i++) 
    { 
     rand_int = ranFunction(); 

     if (words[i] >= upper_A && words[i] <= lower_z) { 

      words[i] -= rand_int; 


     } 

    } 
    return words; 
} 

Я надеюсь получить rotFunction вернуть слова и целое на основе любой rand_int случается каждый раз.

Просто примечание: числа, которые я использую RE: значения ascii и т. Д., Полностью произвольны прямо сейчас, просто для тестирования.

+1

[это] (http://stackoverflow.com/documentation/c%2b%2b/487/returning-several-values-from-a-function#t=201701261136058675108) может вас заинтересовать –

+1

Почему бы не вернуться структура. –

+1

@ Arco3 Для начала это должно быть утверждение rand_int = ranFunction(); быть вне петель? –

ответ

1

Простой способ будет возвращать struct или class типа.

struct rotReturn 
{ 
     int ran; 
     std::string str; 
}; 

rotReturn rotFunction(std::string words) 
{ 
    // what you have, except for the return 
    rotReturn retval 
    retval.ran = rand_int; 
    retval.str = words; 
    return retval; 
} 

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

Альтернативы включают возврат std::pair<int, std::string> или (для большего количества значений), a std::tuple. Оба они являются специализированными типами struct или class.

Также возможно передать такие типы в функции, по ссылке или указателю (адресу), чтобы вызывающий мог передать объект, в который функция хранит данные.

+0

Спасибо, это то, что я закончил делать. – Arco3

2

Чтобы вернуть два различных типа используют std::pair

std::pair<T1,T2> foo(){ 
    return std::make_pair(v1,v2); 
} 

Пример:

std::pair<int,float> foo(){ 
    return std::make_pair(5,0.5f); 
} 

Для возврата более , чем два различных типа используют зЬй :: кортеж:

std::tuple<T1,T2,...,Tn> foo(){ 
    return std::make_pair(v1,v2,...,Tn); 
} 

Пример:

std::tuple<int,float,std::string> foo(){ 
    return std::make_tuple(5,0.5f,"sss"); 
} 
Смежные вопросы