尝试将新值分配给指向字符的指针数组时,C ++崩溃

时间:2015-09-25 23:18:54

标签: c++ arrays pointers 2d

所以我希望通过在char的值上添加32来简单地将大写字符转换为小写字母,这实际上使它的小写等价。

在main中我声明指针数组并分配3个单词:

int main()
{
    char *dictionary[10];
    dictionary[0] = "aUto";
    dictionary[1] = "caR";
    dictionary[2] = "Door";
    int arrayCount = 3;
    upperCase(dictionary, &arrayCount);
}

在我尝试转换的函数中:

void upperCase(char *dictionary[], int *arrayCount)
{
    cout << "In upperCase\n";
    for (int i = 0; i < 3; i++)
        for (int k = 0; dictionary[i][k] != '\0'; k++)
        {
            if (dictionary[i][k] < 97 && dictionary[i][k] > 64) // If     capital is less than the value of 'a' (97)
            {
                dictionary[i][k] += 32;
            }
            else
                cout << "Not a capital\n";
        }
}

程序在字典[i] [k] + = 32时崩溃; 我试图替换字符串中的字符(由数组的元素指向)。即使先转换这封信也行不通。 例如:字典[i] [k] =&#39; a&#39 ;; 仍然崩溃我的程序。 在Windows上运行Eclipse C ++

2 个答案:

答案 0 :(得分:1)

目前,评论中可能已涵盖了大部分内容。刚看了。对。在我发帖之前,我很忙。无论如何,这是问题的解决:

char *dictionary[10];

这很酷。

dictionary[0] = "aUto";

这不酷。 &#34;自动&#34;是string literal。一串常量值。如何存储它取决于编译器。你可以阅读它,但你不应该指望能够写它。对待就像定义为const char *一样,因为就语言而言,它是const char *

为什么这不酷,OP会将const char *分配给char *。将指向常量的指针分配给指向非常量的指针应该至少生成一个警告。最好在编译器中调高警告级别以尽早发现此类错误。在g ++等中,我喜欢-Wall-Wextra-pedantic的副订单。在MSVC中,导航属性 - &gt; C / C ++ - &gt;常规并使用警告级别。 EnableAllWarnings看起来是个好地方。

现在常量值由非常量指针引用,编译器不知道下一位可能是致命的。

dictionary[i][k] += 32;

尝试向一个字符添加32,该部分没问题,然后将结果存储到不可写的位置。这是不允许的,但尝试不可能的确切处理取决于编译器。你遇到程序崩溃,这对编译器来说非常好。该程序本可以继续运行,破坏其他一些内存空间,并在以后死亡,不知道实际发生了什么以及调试什么。

如何使这些字符串不恒定:

  1. 使用std::string而不是char *。在C ++中,这是更好的选择。虽然您正在使用它,但请使用std::vector而不是数组。
  2. 但这有点像家庭作业,你可能不允许使用std :: string。在这种情况下,分配存储并将字符串文字复制到存储中,以便它们具有支持它们的真实,可修改的内存。
  3. 编码风格笔记:

    使用字符&#39; a&#39;而不是使用像97这样的数字值。它的工作原理相同,您的意图更容易确定。最好省去所有麻烦并使用std::tolower

    还可以使用std::transform,std :: string和std :: tolower来删除大量的upperCase函数。尝试一下,你就会发现它。 更正(我似乎总是抓住这个):使用tolower,而不是std :: tolower,因为std :: tolower的语言环境重载使得你想要的std :: tolower模糊不清。

    此:

    for (int i = 0; i < 3; i++)
    

    有点傻。你传入了arrayCount。如果您更改数组中的项目数

    ,您也可以使用它并避免混淆
    for (int i = 0; i < *arrayCount; i++)
    

答案 1 :(得分:-1)

如果你被允许使用C ++,那么你可以改为:

  1. 使用STL
  2. 使用向量,通常更容易处理这些类型的事物
  3. 使用Stringstream(或一般的流)
  4. 但这只是一个想法。但是你的代码看起来更像是一个C问题(宁可使用malloc来分配动态内存)而不是C ++问题。

    另外,你确定dictionary[i][k] += 32操作确实在做你认为应该做的吗?通常在这些类型的代码中崩溃意味着您的指针指向未分配/无效的位置。