Ввод строки с заглавными буквами от пользователя

Я работаю над проблемой, где у меня есть:

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

Если имена вводятся так:

2 EliZAbetH paUL

Вывод должен быть таким:

Elizabeth Paul

Вот что я попробовал:

#include <iostream>
#include<string>
#include <cctype>
#include <stdio.h>
#include <ctype.h>

using namespace std;
const int FYLKJASTAERD = 100;
int main()
{
int FjoldiOrd = 0;

//get the number of students
cout << "Enter the number of students: ";
cin >> FjoldiOrd;

string Nofn[FYLKJASTAERD];

//get student names
for (int i=0; i<FjoldiOrd; i++)
{
cin >> Nofn[i];

if (Nofn.length()>0)
{
Nofn[0] = std::toupper(Nofn[0]);
for (size_t i = 1; i < Nofn.length(); i++)
{
Nofn[i] = std::tolower(Nofn[i]);
}
}
}
cout << Nofn[i] << endl;

return 0;
}

Программа не компилируется и выдает ошибку:

request for member lenght in Nofn which is of non-class type 'std::string[100]

Вопрос:

Не могли бы вы дать мне несколько советов о том, что я делаю неправильно?

Замечания:

Я сделал более простую версию этого только с именем ввода, и это прекрасно работает.

    string name;
cout << "Please enter your first name: ";
cin >> name;

if( !name.empty() )
{
name[0] = std::toupper( name[0] );

for( std::size_t i = 1 ; i < name.length() ; ++i )
name[i] = std::tolower( name[i] );
}
cout << name << endl;

return 0;
}

0

Решение

Код:

    string Nofn[FYLKJASTAERD];

это массив строк. Поэтому вам нужно добавить [index], чтобы получить строку.

Следовательно, вы не можете просить длину Nofn.

Вы можете однако сделать

Nofn[i].length();

чтобы получить длину строки в позиции я в массиве строк.

Далее вы дважды используете имя переменной i. Что довольно плохо.

Может быть, это будет работать лучше (но я сам не пробовал):

//get student names
for (int i=0; i<FjoldiOrd; i++)
{
cin >> Nofn[i];

if (Nofn[i].length()>0)
{
Nofn[i][0] = std::toupper(Nofn[i][0]);
for (size_t j = 1; j < Nofn[i].length(); j++)
{
Nofn[i][j] = std::tolower(Nofn[i][j]);
}
}

}
cout << Nofn[i] << endl;

тем не мение…

Я не думаю, что ваша программа делает именно то, что вы хотите. cin to string останавливается на пробеле, поэтому вы получите имя в транках, а не просто одну строку с именем. Чтобы получить имя, включая пробелы, используйте getline следующим образом:

string name;
getline(cin, name);

Это усложнит вам верхний / нижний регистр кода, потому что вы должны обнаружить пробелы. Может быть, это может сделать:

#include <iostream>
#include<string>
#include <cctype>
#include <stdio.h>
#include <ctype.h>

using namespace std;

void fixString(string& s)
{
bool doUpperCase = true;

for (int i=0; i < s.length(); i++)
{
if (s[i] == ' ')
{
doUpperCase = true;
}
else
{
if (doUpperCase)
{
s[i] = std::toupper(s[i]);
doUpperCase = false;
}
else
{
s[i] = std::tolower(s[i]);
}
}
}
}

const int FYLKJASTAERD = 100;
int main()
{
int FjoldiOrd = 0;

//get the number of students
cout << "Enter the number of students: ";
cin >> FjoldiOrd;
while (cin.get() != '\n')
{
continue;
}

string Nofn[FYLKJASTAERD];

//get student names
for (int i=0; i<FjoldiOrd; i++)
{
getline(cin, Nofn[i]);
fixString(Nofn[i]);
cout << Nofn[i] << endl;
}

return 0;
}
2

Другие решения

Других решений пока нет …