C++ 将C样式字符串char*传递给函数参数
我想更改用户传递的字符串中的字符,将其转换为C样式的字符串,并作为参数传递给具有char*参数的函数:C++ 将C样式字符串char*传递给函数参数,c++,function,pointers,c-strings,C++,Function,Pointers,C Strings,我想更改用户传递的字符串中的字符,将其转换为C样式的字符串,并作为参数传递给具有char*参数的函数: #include <string> #include <cstring> #include <iostream> #include <stdlib.h> void functoupper(char *myString) { int i=0; char z; do { z= myString[i];
#include <string>
#include <cstring>
#include <iostream>
#include <stdlib.h>
void functoupper(char *myString)
{
int i=0;
char z;
do {
z= myString[i];
myString[i]=toupper(z);
++i;
} while(myString[i]!=0);
}
int main() {
std::string name;
std::cout << "Please, enter your full name in small caps: ";
std::getline (std::cin,name);
const char *myString = name.c_str();
std::cout << "Hello, " << functoupper(myString) << "!\n";
return 0;
}
我得到错误:在main中调用函数functouppermyString时,从“const char*”到“char*”[-fppermissive]的转换无效。作为@Someprogrammerdude和@RemyLebeau注释,为什么不简单: 但如果必须通过char*执行此操作,则需要首先复制数据,例如:
char myString* = new char[name.size() + 1];
strcpy(myString, name.c_str());
编辑:感谢@RemyLebeau的有益评论
通过简单地将std::字符串转换为std::vector,更好地避免上述所有内存管理问题:
该方法返回指向常量字符数据的指针,但函数需要指向非常量字符数据的指针。这就是为什么会出现错误
您可以使用丢弃常量,但这实际上并不可取:
char*myString=const_castname.c_str;
FunctUpperMyString;
std::cout为什么不简单:void functoupperstd::string&myString。这里的条件应该是whilei
char myString* = new char[name.size() + 1];
strcpy(myString, name.c_str());
std::vector<char> myVec(std::begin(name), std::end(name));
myVec.push_back(`\0`);
functoupper(myVec.data());
#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
void functoupper(std::string &myString)
{
std::transform(myString.begin(), myString.end(), myString.begin(),
[](unsigned char ch){ return std::toupper(ch); }
);
}
int main() {
std::string name;
std::cout << "Please, enter your full name in small caps: ";
std::getline(std::cin, name);
functoupper(name);
std::cout << "Hello, " << name << "!\n";
return 0;
}
#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
std::string functoupper(std::string myString)
{
std::transform(myString.begin(), myString.end(), myString.begin(),
[](unsigned char ch){ return std::toupper(ch); }
);
return myString;
}
int main() {
std::string name;
std::cout << "Please, enter your full name in small caps: ";
std::getline(std::cin, name);
std::cout << "Hello, " << functoupper(name) << "!\n";
return 0;
}