字符串数组(chars)的c ++元素依赖于源字符串

时间:2011-12-23 19:01:39

标签: c++ string

一点上下文:我正在尝试将一个非常简单的散列函数/散列表作为described here。我基本上是第一步,根据它开头的字母盲目地向数组添加一个键(不检查空间是否被占用)。到目前为止我用来执行此操作的代码:

int main(int argc, char **argv) {
    char *arrayKeys[300];
    std::string aName("Charles");

    char *aNameCpy = new char[aName.size() + 1];
    std::copy(aName.begin(), aName.end(), aNameCpy);
    aNameCpy[aName.size()] = '\0';

    int kPos = storeKey(arrayKeys, aNameCpy);

    std::cout << "The new position in arrayKeys for 'Charles' is:  " <<
        kPos << "\ncontaining the text: " << arrayKeys[kPos] << std::endl;
    delete[] aNameCpy;  
    return 0;
}

int storeKey(char **keys, char *key) {

    int charLett = -1;
    charLett = (int)key[0];
    if(charLett != -1)
        charLett = charLett - 65;

    keys[charLett * 10] = key;

    return charLett*10;
}

我的问题是,如何在数组(arrayKeys)中添加一个字符串,它与数组完全分开,而不依赖于原始字符串?如果在打印数组键之前删除字符串副本(aNamCpy),则数组键将变为乱码。我在将字符串发送到函数之前复制它,因为我需要一个非const字符串来添加到arrayKeys数组(因此可以修改它),并且我看到的任何字符串方法似乎都返回const。

(我尝试的另一个版本可能是found here,但我不想像这样初始化arrayKeys - 具有明确的第二维(字符串)长度)
C ++对我来说还是一个新手,所以我无法弄清楚如何通过将字符串复制到arrayKeys来兼顾非const部分。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

以下是我如何更改代码以使用更现代的C ++结构。我想你会发现这种方式更容易使用。

int storeKey(vector<string> &keys, const string &key) {
    int charLett = -1;

    if (!key.empty()) {  // you weren't doing this before!
        charLett = key[0];
        charLett = toupper(charLett) - 'A';
        keys[charLett * 10] = key;
    }

    return charLett*10;
}

int main() {
    vector<string> arrayKeys(300);
    std::string aName("Charles");

    // No need to bother with the awkward copying.
    // std::vector and std::string will take care of it for us.

    int kPos = storeKey(arrayKeys, aName);

    if (kPos >= 0) {
        cout << "The new position in arrayKeys for 'Charles' is:  " <<
            kPos << "\ncontaining the text: " << arrayKeys[kPos] << endl;
    }

    // Don't have to remember to delete anything because nothing was new'ed.
    return 0;
}

答案 1 :(得分:1)

(@ Kristo有正确的想法。我只是想问一下这个问题的评论。)

基本上,不要删除aNameCpy。您需要副本提醒有效,因此不应删除它。您应该只在删除整个哈希时删除字符串。

  

C ++对我来说还是一个新手,所以我无法弄清楚如何兼顾它   非常数部分

您可以将keyskey声明为const char **keysconst char *key。 keys是指向char的指针。更确切地说,它是 nonconst指针指向 const char 的指针。换句话说,您可以修改keys,您无法修改它(间接)指向的实际字符。

因此,只需将const放入storeKey int storeKey(const char **keys, const char *key)的声明中,然后相应地更新arrayKeys const char *arrayKeys[300];

最后一个样式问题:你应该在storeKey内复制字符串,而不是在main中。这是更好的设计,因为它向读者表明storeKey“拥有”副本。

int storeKey(char **keys, const char *key) {
    char * the_copy = new char[strlen(key)+1];
    strcpy(the_copy, key);

......等等

但是,简而言之,如果可以,请使用C ++ string代替所有这些!