【问题标题】:is there a way to use cin.getline() without having to define a char array size before hand?有没有一种方法可以使用 cin.getline() 而不必事先定义一个 char 数组大小?
【发布时间】:2011-02-03 21:48:04
【问题描述】:

基本上,我的任务是必须对一堆可变长度的字符串进行排序,忽略大小写。我知道有一个函数 strcasecmp() 可以比较 cstrings,但不适用于字符串。现在我正在使用 getline() 处理字符串,所以我可以一次读取一行字符串。我将这些添加到字符串向量中,然后在每次调用 strcasecmp() 时转换为 cstrings。在与 strcasecmp() 比较之前不必将每个字符串转换为 cstring,我想知道是否有一种方法可以在没有预定义 char 数组大小的情况下将 cin.getline() 用于 cstrings。或者,最好的解决方案是只读取字符串,转换为 cstring,存储在向量中,然后排序?

【问题讨论】:

    标签: c++ string cstring getline


    【解决方案1】:

    我假设“转换为 cstring”是指使用字符串的 c_str() 成员。如果是这种情况,在大多数不是真正转换的实现中,它只是一个访问器。仅当您担心性能(听起来像您)时,差异才重要。在内部 std::strings (几乎总是,但技术上不必)表示为“cstring”。该类会为您管理它的大小,但它只是下面动态分配的 cstring。

    所以,直接回答:使用cin.getline时必须指定数组的大小。如果您不想指定大小,请使用 getline 和 std::string。这种方法没有错。

    【讨论】:

    • hmm 多出一行 string.c_str() 不会显着减慢程序的速度吗?
    • @zebraman:这可能是您最不关心的问题。分析并查看花费的时间比例。
    【解决方案2】:

    C++ 本身就非常高效。除非您确实有需要做其他事情,否则就让它去做吧。

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <string>
    #include <vector>
    #include <cstring>
    
    using namespace std;
    
    bool cmp(string a, string b)
    {
        return(strcasecmp(a.c_str(), b.c_str()) < 0);
    }  
    
    
    int main(int argc, char *argv[])
    {
        vector<string> strArr;
    
        //too lazy to test with getline(cin, str);
    
        strArr.push_back("aaaaa");
        strArr.push_back("AAAAA");
        strArr.push_back("ababab");
        strArr.push_back("bababa");
        strArr.push_back("abcabc");
        strArr.push_back("cbacba");
        strArr.push_back("AbCdEf");
        strArr.push_back("aBcDeF");
        strArr.push_back("  whatever");
    
        sort(strArr.begin(), strArr.end(), cmp);
    
        copy(strArr.begin(), strArr.end(), ostream_iterator<string>(cout, " \n"));
    
        return(0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      相关资源
      最近更新 更多