使用tolower时c ++格式化错误与c ++字符串

时间:2011-04-22 21:16:40

标签: c++ cstring

嗨所以我正在尝试使用cstring并将其设为小写,但是当我在最后打印cstring时,我会得到一个奇怪的格式框,其中一些字母应该是。有没有人有任何想法?

#include <string>
#include <iostream>
#include <string.h>

using namespace std;

int main () 
{ 
    int i=0; 
    char* str="TEST"; 
    char c; 
    char* cstr = new char[strlen(str) + 1];
    while (str[i]) 
    { 
        c = str[i]; 
        c = tolower(c);
        strcat(cstr, &c); 
        i++; 
    } 

    cout << cstr << endl; 
    return 0; 
}

4 个答案:

答案 0 :(得分:4)

问题是您错误地调用了strcat。第二个参数不是以空字符结尾的字符串。

您根本不需要致电strcat。只需直接写入输出字符串:

尝试:

  while (str[i])
  {
    c = str[i];
    c = tolower(c);
    cstr[i] = c;
        i++;
  }
  cstr[i] = 0;

或等同于:

while(str[i])
{
  cstr[i] = tolower(str[i]);
  i++;
}
cstr[i] = 0;

答案 1 :(得分:1)

strcat需要以null结尾 char*,因此通过提供您正在调用undefined behavior的本地char的地址。

此外,new char[std::strlen(str) + 1]不会将数组初始化为0,这意味着cstr也不会正确地以空值终止;将()添加到new[]会导致数组进行值初始化。

请改为尝试:

#include <cstddef>
#include <cctype>
#include <cstring>
#include <ostream>
#include <iostream>

int main()
{
    char const* str = "TEST";
    char c[2] = { };
    char* cstr = new char[std::strlen(str) + 1]();
    std::size_t i = 0;
    while (str[i])
    {
        c[0] = static_cast<char>(std::tolower(str[i++]));
        std::strcat(cstr, c);
    }
    std::cout << cstr << std::endl;
    delete [] cstr;
}

答案 2 :(得分:0)

strcat的第二个参数应该是一个以空字符结尾的字符串,而不是单个字符的地址。 strcat不适合这种用途。

int main ()
{
    const char* str="TEST";
    char* cstr = new char[strlen(str) + 1];
    cstr[strlen(str)] = 0;
    for (int i = 0; str[i]; ++i) {
        cstr[i] = tolower(str[i]);
    }
    cout << cstr << endl;
}

答案 3 :(得分:0)

#include <cstddef>
#include <cctype>
#include <cstring>
#include <ostream>
#include <iostream>

#include <string>

int main()
{
    std::string str = "TEST";
    std::string cstr;

    for (std::string::const_iterator it = str.begin(); it!= str.end(); ++it)
        cstr.push_back(tolower(*it));

    std::cout << cstr << std::endl;
}

甚至更短:

#include <algorithm>
#include <iterator>

...

    std::transform(str.begin(), str.end(), std::back_inserter(cstr), tolower);