所以我希望通过在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 ++
答案 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,该部分没问题,然后将结果存储到不可写的位置。这是不允许的,但尝试不可能的确切处理取决于编译器。你遇到程序崩溃,这对编译器来说非常好。该程序本可以继续运行,破坏其他一些内存空间,并在以后死亡,不知道实际发生了什么以及调试什么。
如何使这些字符串不恒定:
编码风格笔记:
使用字符&#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 ++,那么你可以改为:
但这只是一个想法。但是你的代码看起来更像是一个C问题(宁可使用malloc来分配动态内存)而不是C ++问题。
另外,你确定dictionary[i][k] += 32
操作确实在做你认为应该做的吗?通常在这些类型的代码中崩溃意味着您的指针指向未分配/无效的位置。