所以我的班级有一个问题,我必须存储十个名字,将它们大写,然后按字母顺序对它们进行排序。我们刚开始使用字符串,有些东西对我来说仍然有些混乱。此代码可以将所有名称存储在字符串数组中,但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');
}
}
}
答案 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
}