有没有办法使用cin.getline()而不必事先定义一个char数组大小?

时间:2010-04-02 23:10:15

标签: c++ string cstring getline

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

2 个答案:

答案 0 :(得分:2)

我假设“转换为cstring”意味着使用字符串的c_str()成员。如果是这种情况,在大多数实现中并非真正的转换,它只是一个访问者。只有当你担心性能时(这听起来像你这样),差异才是最重要的。内部的std :: strings(几乎总是,但在技术上并非必须)表示为“cstring”。该类负责管理它的大小,但它只是一个动态分配的cstring。

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

答案 1 :(得分:0)

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