Проблема со string

cod1

Рядовой
Сообщения
4
Реакции
0
В общем, есть код, который запрашивает у пользователя его имя (для этого создан класс Student с переменной name). Далее программа сначала меняет все буквы в имени на маленькие, а затем делает первую букву заглавной.

К примеру, вы вводите имя aleXANDEr, программа должна привести к виду Alexander. Код ниже:

Код:
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <windows.h>
 
using namespace std;
 
class Student 
{
public:
    string name;
};
 
void str_to_lower(string str)
{
    transform(str.begin(), str.end(), str.begin(), tolower);
}
 
void small_letter_to_big(string str)
{
    str[0] = toupper(str[0]);
}
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    Student firstStudent;
 
    cout << "Введите имя:" << endl;
    getline(cin, firstStudent.name);
 
    cout << "\nВаше имя до изменений: "<< firstStudent.name << endl;
 
    str_to_lower(firstStudent.name);
    small_letter_to_big(firstStudent.name);
 
    cout << "\nВаше имя после изменений: " << firstStudent.name << endl;
}
Проблема заключается в том, что я делал это через функции, это проще, так как в проекте будет довольно много моментов, когда придется проделывать такие махинации со строками, если делать без функций, то можно сделать так:

Код:
  transform(firstStudent.name.begin(), firstStudent.name.end(), firstStudent.name.begin(), tolower);
 
   firstStudent.name[0] = toupper(firstStudent.name[0]);
...и это будет работать, но повторюсь, мне нужно через функции, а через них почему-то не работает, хотелось бы знать почему...
 

NonJubyL3y

hackerville
hackerville
Сообщения
10
Реакции
2
Не работает потому что передача аргументов в функцию происходит по значению, а не по ссылке на объект, поэтому поле name не меняется, а меняется локальная переменная str в функции.

Решение:
Передавать аргумент по ссылке
void str_to_lower(string &str)
{
transform(str.begin(), str.end(), str.begin(), tolower);
}

void small_letter_to_big(string &str)
{
str[0] = toupper(str[0]);
}
Остальной код не меняется.
 

redsa

Ефрейтор
Сообщения
9
Реакции
0
Не работает потому что передача аргументов в функцию происходит по значению, а не по ссылке на объект, поэтому поле name не меняется, а меняется локальная переменная str в функции.

Решение:
Передавать аргумент по ссылке
void str_to_lower(string &str)
{
transform(str.begin(), str.end(), str.begin(), tolower);
}

void small_letter_to_big(string &str)
{
str[0] = toupper(str[0]);
}
Остальной код не меняется.
Верно сказал. Я думаю это решит проблему.
 

JubyL3y

Кодер
Кодер
hackerville
Сообщения
13
Реакции
8
Вкину ради количества сообщений
Можно передавать также по указателю, не всегда передача по ссылке разрешена
Также в вашем случае возможно проще сделать функции методами класса Student, тогда и передавать их не нужно будет ( ну это на будущее )