C++ 这段代码在c++;?I';我们必须使用c字符串

C++ 这段代码在c++;?I';我们必须使用c字符串,c++,c-strings,C++,C Strings,我已经创建了一个c字符串数组。此代码接受三个字符串的输入,然后将其显示在控制台上。 但不幸的是,输入正常,但输出显示不工作 int main() { char *str[20]; std::cout << "Enter values to strings: "; for (int i = 0; i < 3; i++) { std::cout << "\nstr" <<

我已经创建了一个c字符串数组。此代码接受三个字符串的输入,然后将其显示在控制台上。 但不幸的是,输入正常,但输出显示不工作

int main()
{
    char *str[20];
    std::cout << "Enter values to strings: ";
    for (int i = 0; i < 3; i++)
    {
        std::cout << "\nstr" << i<<": ";
        std::cin >> str[i];
    }
    std::cout << "\n\n\nouput:";
    for (int i = 0; i < 3; i++)
    {
        std::cout << "\nstr" << i<<":";
        std::cout << str[i];
    }
    return 0;
}
    
intmain()
{
char*str[20];

std::cout如注释中所述,如果您需要使用C字符串(即,您不能使用
std::string
,我通常会推荐使用),则使用未初始化的指针是,只需使用
运算符new
为C字符串分配内存。一种可能的方法是定义预期输入字符串的某个常量最大长度,将输入读取到缓冲区,然后分配必要的内存并将数据复制到新分配的空间:

#include <iostream>
#include <cstring>

constexpr int MAX_STR_LEN = 255;

int main()
{
    char *str[20];
    char buff[MAX_STR_LEN];  // going to read strings here and copy them to `str` array
    std::memset(buff, 0, MAX_STR_LEN);  // fill the buffer with zeroes
    std::cout << "Enter values to strings: ";
    for (int i = 0; i < 3; i++)
    {
        std::cout << "\nstr" << i<<": ";
        std::cin >> buff;
        str[i] = new char[std::strlen(buff)+1];  // +1 for terminating null
        std::memcpy(str[i], buff, std::strlen(buff));
        str[i][std::strlen(buff)] = 0;  // last character should be null
    }
    std::cout << "\n\n\nouput:";
    for (int i = 0; i < 3; i++)
    {
        std::cout << "\nstr" << i<<":";
        std::cout << str[i];
        delete[] str[i];
    }
    return 0;
}
#包括
#包括
constexpr int MAX_STR_LEN=255;
int main()
{
char*str[20];
char buff[MAX_STR_LEN];//在此处读取字符串并将其复制到'STR'数组
std::memset(buff,0,MAX_STR_LEN);//用零填充缓冲区

std::cout如注释中所述,如果您需要使用C字符串(即,您不能使用
std::string
,我通常会推荐使用),则使用未初始化的指针是,只需使用
运算符new
为C字符串分配内存。一种可能的方法是定义预期输入字符串的某个常量最大长度,将输入读取到缓冲区,然后分配必要的内存并将数据复制到新分配的空间:

#include <iostream>
#include <cstring>

constexpr int MAX_STR_LEN = 255;

int main()
{
    char *str[20];
    char buff[MAX_STR_LEN];  // going to read strings here and copy them to `str` array
    std::memset(buff, 0, MAX_STR_LEN);  // fill the buffer with zeroes
    std::cout << "Enter values to strings: ";
    for (int i = 0; i < 3; i++)
    {
        std::cout << "\nstr" << i<<": ";
        std::cin >> buff;
        str[i] = new char[std::strlen(buff)+1];  // +1 for terminating null
        std::memcpy(str[i], buff, std::strlen(buff));
        str[i][std::strlen(buff)] = 0;  // last character should be null
    }
    std::cout << "\n\n\nouput:";
    for (int i = 0; i < 3; i++)
    {
        std::cout << "\nstr" << i<<":";
        std::cout << str[i];
        delete[] str[i];
    }
    return 0;
}
#包括
#包括
constexpr int MAX_STR_LEN=255;
int main()
{
char*str[20];
char buff[MAX_STR_LEN];//在此处读取字符串并将其复制到'STR'数组
std::memset(buff,0,MAX_STR_LEN);//用零填充缓冲区

std::cout
str
是一个由20个未初始化指针组成的数组。将这些指针用于任何对象都是未定义的。您需要为字符串创建空间。(由于您“必须”使用C字符串,因此您应该已经知道执行此操作的方法。)您发布的代码无法编译。请张贴包含输入、输出和预期输出的读取和良好的信息。从现有的C++开源软件(例如……)中获取灵感。您想使用并且可能会使用。使用
g++-Wall-Wextra-g
编译。然后使用调试器了解程序的行为。对于无法使用
std::string
C_str()的C字符串,您需要做些什么
method?
str
是一个由20个未初始化指针组成的数组。使用这些指针进行任何操作都是未定义的。您需要为字符串创建空间。(因为您“必须”使用C字符串,所以您应该已经知道执行此操作的方法。)您发布的代码无法编译。请张贴包含输入、输出和预期输出的读取和良好的信息。从现有的C++开源软件(例如……)中获取灵感。您想使用并且可能会使用。使用
g++-Wall-Wextra-g
编译。然后使用调试器了解程序的行为。对于无法使用
std::string
C_str()的C字符串,您需要做些什么
method?您通常仍然可以创建
std::string
,即使您必须将它们作为C字符串发送到C库。
std::string
内部必须将该字符串存储为C字符串(从C++11开始),并为此提供
C_str()<代码> >访问此内部字符串作为<代码> char */COD>。我们仍然应该在C++代码中更喜欢<代码> STD::String 并按照您通常推荐的方式执行。@ NigoLasdUSATAR> <代码> STD::String 已经有<代码> CyString()
早在C++11之前就开始考虑C兼容性。只有内部存储在C++11中被标准化,这是大多数实现已经使用过的做法。@RemyLebeau是的,这就是我的意思。可能措辞不够准确。但是内部存储要求强制了兼容性。我们现在可以发送一个非Const
char*
打算由C库填充(考虑到我们需要
resize()
之后的
std::string
来匹配新的内部长度)在C++ 11之前,这是不规范的。自从C++ 11以来,我没有看到任何用例,我们不能在C++中使用<代码> STD::String 。通常,你仍然可以创建<代码> STD::String 。即使你必须把它们作为C字符串发送到C库。<代码>:ST::String 内部必须将字符串存储为C字符串(因为C++ 11)。为此,提供了<代码> CyString()/Case>方法来访问该内部字符串作为<代码> char */COD>。我们仍然应该在C++代码中更喜欢<代码> STD::String 并按照您通常推荐的方式执行。@ NigoLasdUSATAR> <代码> STD::String 已经有<代码> CyString()
早在C++11之前就开始考虑C兼容性。只有内部存储在C++11中被标准化,这是大多数实现已经使用过的做法。@RemyLebeau是的,这就是我的意思。可能措辞不够准确。但是内部存储要求强制了兼容性。我们现在可以发送一个非COnSt>代码> char */COD>要由C库填充(给定我们需要<代码> Resiz())/<代码> <代码> STD::String < /代码>匹配新的内部长度(在C++ 11之前没有标准化)。因为C++ 11,我没有看到任何用例,我们不能在C++侧使用<代码> STD::String 。