Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将C样式字符串char*传递给函数参数_C++_Function_Pointers_C Strings - Fatal编程技术网

C++ 将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];

我想更改用户传递的字符串中的字符,将其转换为C样式的字符串,并作为参数传递给具有char*参数的函数:

#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。这里的条件应该是whileichar 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;   
}