簡體   English   中英

為什么 std::string 變量在 C++ 中一次只接受 1 個字符?

[英]Why do std::string variables accept only 1 character at a time in C++?

我面臨的問題是,每當我嘗試在基於結構的簡單數據庫應用程序中讀取用戶輸入時,程序一次只接受 1 個字符。 當我在 function 中輸入 2 個或更多字符作為輸入時, fill_the_database()跳過此類的一個部分:

        std::cout << "What is the product's name? "; 
        std::cin >> (*database).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

為什么會這樣?

這是代碼:

#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()
{

}

你混淆了[i]應該在的地方。 目前,您正在訪問數組中的第一個product ,然后您嘗試訪問每個字符串中的第i個字符(此時可能不存在)。

它應該看起來像這樣(對於所有其他讀取也是如此):

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

此外,折扣閱讀存在問題。 您應該將product中的discounted更改為bool類型,或者將字符串"YES" / "NO"存儲在該變量中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM