C ++使用动态数组将小写更改为大写

时间:2015-04-08 13:52:14

标签: c++ pointers dynamic-arrays

我正在尝试使用动态数组将小写单词更改为大写单词。在遇到“堆腐败”之前,我碰到了一些我没有遇到的事情。有人可以向我解释我做错了什么,可能有助于解决这个问题?

#include <iostream>
#include <cctype>
#include <new>
#include <string>
using namespace std;

int main()
{
    int i;
    int w;
    char *p;
    string str;

    cout << "Change lowercase to UPPERCASE!" << endl;
    cout << "Enter Word: ";
    cin >> str;
    w = str.length();

    p = new (nothrow) char[w];

    if (p == nullptr)
        cout << "Error: memory could not be allocated" << endl;
    else
    {
        cout << "Re-Enter Word: ";
        cin >> p[w];
        for (i = 0; i < w; i++)
            cout << static_cast<char>(toupper(p[i]));
        cout << endl;
    }

    delete[] p;

    cout << "Press <Enter> to Exit";
    cin.get();
    return 0;
}

2 个答案:

答案 0 :(得分:6)

无需使用char*转换为大写字母。相反,你可以像这里一样使用std::transform

transform(str.begin(), str.end(), str.begin(), ::toupper);
cout << str << endl;

---编辑---
如果出于任何(学术)原因,您希望在动态分配的char数组上执行大写转换,那么您仍然可以使用std::transform

但是,正如您在下面的代码段中看到的那样,您需要为尾随\0 - char分配一个额外的字符,该字符表示字符串的结尾。

char* szStr = new char[w+1];
std::transform(str.begin(), str.end(), szStr, ::toupper);
szStr[w]='\0';
cout << szStr << endl;

答案 1 :(得分:1)

你犯了这么多错误,但只回答你的问题:

p = new (nothrow) char[w + 1];

这样我们就可以有空终止字符(&#39; \ 0&#39;)

并且还使用:

cin >>  p;