C++ 为什么std::string变量在C++;?

C++ 为什么std::string变量在C++;?,c++,c++11,struct,runtime-error,C++,C++11,Struct,Runtime Error,我面临的问题是,每当我试图在我简单的基于结构的数据库应用程序中读取用户输入时,程序一次只接受1个字符。 当我在函数fill\u中输入两个或两个以上字符时,\u database()会跳过这种类型的一部分: std::cout << "What is the product's name? "; std::cin >> (*database).name[i]; std::cout>(*数据库).name[i]; 当我

我面临的问题是,每当我试图在我简单的基于结构的数据库应用程序中读取用户输入时,程序一次只接受1个字符。 当我在函数
fill\u中输入两个或两个以上字符时,\u database()
会跳过这种类型的一部分:

        std::cout << "What is the product's name? "; 
        std::cin >> (*database).name[i];
std::cout>(*数据库).name[i];
当我第二次尝试粘贴2个或更多字符时,我在控制台中看到这样的消息:

/home/keith/builds/mingw/gcc-9.2.0-mingw32-cross-native/mingw32/libstdc++-v3/include/bits/basic_string.h:1067: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = char&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = unsigned int]: Assertion '__pos <= size()' failed

/home/keith/builds/mingw/gcc-9.2.0-mingw32-cross-native/mingw32/libstdc++-v3/include/bits/basic\u string.h:1067:std::\u cx11::basic\u string::reference std:\u cx11::basic\u string::operator[](std:\u cx11::basic\u string::size\u type)[使用CharT=char;_Traits=std::char\u Traits;_Alloc=std::分配器;std:_cx11::basic\u string::reference=char&;std:_cx11::basic\u string::size\u type=unsigned int]:断言“\u pos您混淆了
[i]的位置]
应该是。当前,您首先从数组中访问
产品
,然后尝试访问每个字符串中的
i
-第个字符(此时可能不存在)

它应该是这样的(对于所有其他读取也是如此):



此外,折扣读取也有问题。您应该将
产品
中的
折扣
更改为
bool
类型,或者将字符串
“YES”
/
“NO”
存储在该变量中。

您混淆了
[i]的位置
应该是。当前,您首先从数组中访问
产品
,然后尝试访问每个字符串中的
i
-第个字符(此时可能不存在)

它应该是这样的(对于所有其他读取也是如此):



此外,折扣读取也有问题。您应该将
产品
中的
折扣
更改为
bool
类型,或者将字符串
“YES”
/
“NO”
存储在该变量中。

因为您编写的代码只读取一个字符。在语句
std::cin>(*数据库)中。name[i]
*数据库
数据库[0]
,它有一个成员
名称
,其类型为
std::string
。因此
(*数据库)。名称[i]
是该字符串的第一个字符。请删除
[i]
如果要读取可能包含一个或多个字符的字符串,则该语句将读取
数据库[0]。name
。这并不能解决问题,但
(*数据库)。name[i]
通常写为
数据库->name[i]
。它们的意思相同,但后者不那么麻烦。因为您编写的代码只读取一个字符。在语句
std::cin>(*database)中,
*database
数据库[0]
,它有一个
名称
,类型为
std::string
。因此
(*database)。name[i]
是该字符串的第一个字符。如果要读取可能包含一个或多个字符的字符串,请删除
[i]
,这样该语句将读取
数据库[0]。name
。这并不能解决问题,但
(*数据库)。name[i]
通常被写成
数据库->name[i]
。它们的意思相同,但后者不那么麻烦。使用
std::array
可以防止索引运算符的无效使用。循环的范围相同。使用
std::array
可以防止索引运算符的无效使用。循环的范围相同。
#include <iostream>
#include <cstdio>

struct product 
{
    std::string name;
    std::string category;
    std::string size;
    std::string price;
    std::string discounted;
};

const int quantity = 3;
product database[quantity];

void display_menu();

void fill_the_database();
void show_the_database();
void search_for_an_item();
void sort_the_database();
void save_the_database();

int main()
{
    std::cout << "Hello! Your database can contain as many elements as " << quantity << "! \n";

    while(true)
    {
        display_menu();
    }

    std::cout << "\n"; system("pause"); return 0;
}

void display_menu()
{
    std::cout << "Fill the database - 1. \n";
    std::cout << "Show the database - 2. \n";
    std::cout << "Look for an item in the database - 3. \n";
    std::cout << "Sort the database - 4. \n";
    std::cout << "Save the database - 5. \n";
    std::cout << "Exit the database interface - 6. \n";

    int choice = 0;

    std::cout << "Your choice: "; std::cin >> choice;

    switch (choice)
    {
        case 1:
            fill_the_database();
        break;

        case 2:
            show_the_database();
        break;

        case 3:
            search_for_an_item();
        break;

        case 4:
            sort_the_database();
        break;

        case 5:
            save_the_database();
        break;

        case 6: 
            exit(0);
        break;
    
        default:
            std::cout << "You didn't enter a valid option. \n";
        break;
    }
}

void fill_the_database()
{
    std::string if_discounted;

    for(int i = 0; i < quantity; i++)
    {
        std::cout << "What is the product's name? "; 
        std::cin >> (*database).name[i];

        std::cout << "What is the prodyct's category? ";
        std::cin >> (*database).category[i];

        std::cout << "What is the product's size(S / M / L)? ";
        std::cin >> (*database).size[i];

        std::cout << "What is the product's price? ";
        std::cin >> (*database).price[i];

        std::cout << "Is the product discounted(YES / NO)? "; 
        std::cin >> if_discounted;

        if(if_discounted == "YES")
        {
            (*database).discounted[i] = true;
        }

        else if(if_discounted == "NO")
        {
            (*database).discounted[i] = false;
        }

        else 
        {
            std::cout << "You didn't enter a valid option. \n";
        }
    }
}

void show_the_database()
{

}

void search_for_an_item()
{

}

void sort_the_database() 
{

}

void save_the_database()
{

}
std::cin >> database[i].name;