【问题标题】:String array homework字符串数组作业
【发布时间】:2014-05-10 17:32:45
【问题描述】:

所以我的班级有一个硬件问题,我必须存储十个名字,将它们大写,然后按字母顺序排序。我们刚开始使用字符串,有些事情对我来说仍然有点困惑。此代码可以将所有名称存储在字符串数组中,但大写字母似乎不起作用。我不确定,但我认为这是因为我有第二个循环运行上限次数,即 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');
    }
}

}

【问题讨论】:

  • STL 不在问题范围内吗?
  • 你是对的,capUpperCase() 中内部循环的错误终止条件,.length() 是正确的,所以请显示你的代码。另外:如果名称中包含字符 a 会怎样?
  • 有趣的是,您将使用 std::string,然后使用数组而不是更高级的容器类。
  • 我应该提到两件事:也许this article 会帮助你(提示:空终止符)。其次,UpperCase 中的 if 语句也不会检查它是否为 &gt; 'z'
  • 我认为 T.C. 的回答非常有帮助,但总的来说,如果您具体告诉我们什么不起作用,它会有所帮助。它编译了吗?跑了吗?它产生了输出吗?如果是这样,它到底有什么问题?如果其中任何一个步骤失败,我们必须知道在哪里以及以何种方式。我敢肯定,如果您提供这些信息(例如,学习如何使用调试器并获取堆栈跟踪),那么您自己解决问题的方法就大半了。

标签: c++ arrays string


【解决方案1】:

您的内部循环应该迭代字符串的长度。 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]);
        }
    }
}

【讨论】:

    【解决方案2】:

    ...,但大写似乎不起作用

    所以编写一个只是在已知输入上调用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
    }
    

    【讨论】:

    • gcc 4.8.2 在没有帮助的情况下找不到有效的重载...我可以将其替换为 (int (*)(int)) std::toupper,但我认为这比 lambda 更难看,更难阅读。
    • 只需使用::toupper 而不是std::toupper,则不需要强制转换。在语言环境中也有一个版本,也许这就是它与演员解决的混合版本。这里有一个简短的讨论:stackoverflow.com/a/7131881/3332992
    • 嗯,这依赖于 C 版本(来自 &lt;ctype.h&gt;) - 答案的后半部分建议使用丑陋的演员表。
    猜你喜欢
    • 2018-05-12
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多