嗨所以我正在尝试使用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;
}
答案 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);