字符串数组作业

时间:2014-05-10 17:32:45

标签: c++ arrays string

所以我的班级有一个问题,我必须存储十个名字,将它们大写,然后按字母顺序对它们进行排序。我们刚开始使用字符串,有些东西对我来说仍然有些混乱。此代码可以将所有名称存储在字符串数组中,但UpperCase似乎无法正常工作。我不确定,但我认为这是因为我有第二次循环运行上限次数,这将是10.并且因为不是每个字符串都有10个元素,我遇到了问题?..是它还是是别的吗?好吧,我试图通过使用.length(函数?)来解决这个问题,找到数组中每个名字的长度,但我总是得到错误。感谢任何帮助,谢谢!

#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');
    }
}

}

2 个答案:

答案 0 :(得分: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 :(得分:1)

  

...,但是UpperCase似乎无法正常工作

所以写一个 在已知输入上调用UpperCase的最小程序。它使调试变得容易,并且还可以提出更好的问题。我们不需要查看打印或交换来帮助解决这个问题,并提示用户输入与UpperCase是否有效无关。

话虽如此,你应该使用std::string::length() - 但是,你说

  

我试图通过使用.length(函数?)来解决这个问题,找到数组中每个名字的长度,但我总是得到错误

但不要显示您实际尝试的内容或错误是什么。


根据T.C.的回答,这是一个最小,完整且自包含的程序,使用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
}