Использование заглавных букв, вводимых пользователем

Я работаю над проблемой, в которой у меня:

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

Если имена вводятся следующим образом:

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;
}

person BMG    schedule 25.09.2015    source источник
comment
И? это не компилируется? он компилируется, но не работает? Если вы получаете результат, что это такое и каким должно быть?   -  person NathanOliver    schedule 25.09.2015
comment
Учитывая, что это похоже на исландский, обратите внимание, что аргумент std::toupper из C должен быть неотрицательным целым числом или EOF. Итак, переведите его в unsigned char. И то же самое для std::tolower.   -  person Cheers and hth. - Alf    schedule 25.09.2015
comment
Черт возьми, я забыл указать, что код не компилируется, это дает мне эту ошибку: запрос длины члена в Nofn, который имеет неклассовый тип 'std :: string [100]   -  person BMG    schedule 25.09.2015
comment
Почему бы не проиндексировать этот массив.   -  person Cheers and hth. - Alf    schedule 25.09.2015
comment
@BMG Вопрос должен быть отредактирован / обновлен, чтобы включить в него любые / все относящиеся к делу детали (то есть, укажите детали, которые вы забыли, в вопросе, а не в комментариях).   -  person James Adkison    schedule 25.09.2015
comment
Может if (Nofn.length()>0) должно быть if (Nofn[i].length()>0)?   -  person Galik    schedule 25.09.2015
comment
Укажите, пожалуйста, в чем проблема! Не просто комментируйте. Отредактируйте свой вопрос, чтобы сделать его более точным.   -  person 4386427    schedule 25.09.2015


Ответы (1)


Код:

    string Nofn[FYLKJASTAERD];

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

Следовательно, вы не можете запрашивать длину Нофн.

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

Nofn[i].length();

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

Далее вы дважды используете имя переменной 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 в строку остановится на пробеле, поэтому вы получите имя в стволах, а не только одну строку с именем. Чтобы получить имя, включая пробелы, используйте 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;
}
person 4386427    schedule 25.09.2015
comment
Спасибо за это, это очень помогает :) - person BMG; 26.09.2015