2014-05-10 2 views
1

Итак, у меня есть проблема hw для моего класса, где я должен хранить десять имен, использовать их взаймы, а затем сортировать их по алфавиту. Мы только начали использовать строки, и есть некоторые вещи, которые все еще немного запутывают меня. Этот код может хранить все имена в массиве строк, но UpperCase, похоже, не работает. Я не знаю наверняка, но я думаю, что это потому, что у меня есть секунда для колпачка с циклом, равная 10. И так как не каждая строка будет содержать 10 элементов, у меня возникают проблемы? .. Это или она или это что-то еще? Ну, я попытался исправить это, используя .length (function?), Чтобы найти длину каждого имени в массиве, но всегда получаю ошибки. Любая помощь приветствуется, спасибо!String array homework

#include<iostream> 
#include<string> 
using namespace std; 

void UpperCase(string names[],int cap); 

void print(string names[],int cap); 
void swap(string names[],int &x,int &y); 

string names[10]; 

int main(){ 
    char a; 
    cout<<sizeof(a); 
    for(int i=0;i<10;i++){ 
     cout<<"Enter a name for student "<<i+1<<" : "; 
     cin>>names[i]; 
     cout<<endl; 
    } 

    UpperCase(names,10); 
    cout<<endl; 
    print(names,10); 

    cout<<endl; 
    print(names,10); 

    return 0; 
} 

void print(string names[],int cap){ 
    for(int i=0;i<cap;i++) 
     cout<<names[i]<<endl; 
} 

void UpperCase(string names[],int cap){ 
for(int student=0;student<cap;student++){ 
    for(int letter=0;letter<names[student].length();letter++){ 
     if(names[student][letter]>='a') 
      names[student][letter]-=('a'-'A'); 
    } 
} 

}

+0

Является ли вопрос STL из вопросов? –

+2

Вы правы в том, что 'cap' является неправильным условием завершения внутреннего цикла в' UpperCase() 'и' .length() 'является правильным, поэтому, пожалуйста, покажите свой код для последнего. Отдельно: что произойдет, если имя содержит символ 'a'? –

+1

Забавно, что вы будете использовать 'std :: string', а затем использовать массивы вместо значительно превосходящих классов контейнеров. –

ответ

3

Ваш внутренний цикл должен быть итерация для длины строки. string::length() - это функция, а не поле, поэтому вам нужны скобки. Существует также стандартная библиотечная функция для преобразования символа в верхний регистр.

#include <cctype> 
using std::toupper; 

void UpperCase(string names[],int cap){ 
    for(int student=0;student<cap;student++){ 
     for(int letter=0;letter<names[student].length();letter++){ 
      names[student][letter] = toupper(names[student][letter]); 
     } 
    } 
} 
1

..., но UpperCase, кажется, не работает

Так написать минимальную программу, которая только вызовы UpperCase на известном входе. Это облегчает отладку, а также дает гораздо лучший вопрос. Нам не нужно видеть печать или своп, чтобы помочь с этим, и запрос пользователю на ввод не имеет отношения к работе UpperCase.

Сказав это, вы должны использовать std::string::length() - однако, вы говорите

Ну я попытался исправить это с помощью .Length (функция?), Чтобы найти длину каждого имени в массиве, но я всегда получаю ошибки

но не показываю, что вы на самом деле пытались или какие были ошибки.


Вот минимальный, полный и автономная программа, используя std::toupper согласно ответу Агар Т.С. в. Я изменил его, чтобы продемонстрировать более современный стиль, и показать, что есть более простые способы подтвердить работу ваших функций, чем написать целую программу, а затем выяснить, что она сломана.

#include <algorithm> // for transform, for_each 
#include <cctype>  // for toupper 
#include <string> 
#include <vector>  // easier to use (correctly) than bare arrays 

// change a string to upper case 
void str_toupper(std::string &s) { 
    std::transform(s.begin(), s.end(), 
        s.begin(), 
        [](char c) -> char { return std::toupper(c); }); 
} 
// change a vector of strings to upper case 
void vec_toupper(std::vector<std::string>& v) { 
    std::for_each(v.begin(), v.end(), str_toupper); 
} 

using namespace std; 
int main() { 
    vector<string> const input = { "bob", "alice cooper", "Eve" }; 
    vector<string> const expected = { "BOB", "ALICE COOPER", "EVE" }; 

    vector<string> working = input; 
    vec_toupper(working); 
    return working == expected ? 0 : -1; 
    // use cout or debugger to solve problem only if program returns nonzero 
} 
+0

Лямбда действительно не нужна для преобразования работы. – imbtfab

+0

gcc 4.8.2 не находит допустимую перегрузку без какой-либо помощи ... Я могу заменить ее на '(int (*) (int)) std :: toupper', но я думаю, что это ужасно и труднее читать, чем лямбда. – Useless

+0

Просто используйте :: toupper вместо std :: toupper, тогда вам не нужен листинг. В версии также есть версия, возможно, это та, которую она смешивает, с которой решает вопрос. Здесь кратко обсуждается: http://stackoverflow.com/a/7131881/3332992 – imbtfab