为什么在C ++中std :: string变量一次只能接受1个字符?

惠子

我面临的问题是,每当我尝试在基于结构的简单数据库应用程序中读取用户输入时,程序一次仅接受1个字符。当我在函数中输入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每个字符串中的-th个字符(此时可能不存在)。

它应该看起来像这样(并且对于所有其他读取类似):

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

另外,折扣读取存在问题。要么你应该改变discountedproductbool类型,或者存储字符串"YES"/"NO"变量里面。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么导航栏中的SwiftUI TextField一次只能接受一个字符的输入

来自分类Dev

为什么sed一次不能匹配一个文件中的多个字符?

来自分类Dev

从一个字符中构造std :: string的最佳方法是什么?

来自分类Dev

在字符串C#中输出一个字符的一次出现

来自分类Dev

为什么我一次只能从okhttp.Response InputStream中读取2048个字节?

来自分类Dev

为什么使用 char 变量从文件中读取一个字符又吃了一个下一个字符?

来自分类Dev

尝试从文件中打印随机行,但一次只能打印一个字符

来自分类Dev

为什么 jquery datepicker 在同一个表单中只能工作一次?

来自分类Dev

为什么SwiftUI中的Picker只能运行一次

来自分类Dev

为什么在第二次迭代中跳过第一个字符

来自分类Dev

如何从c中没有空格的字符串中一次获取一个字符?

来自分类Dev

为什么string.TrimEnd不只删除字符串中的最后一个字符

来自分类Dev

在C ++中,为什么auto无法与std :: atomic一起使用?

来自分类Dev

在C ++中,为什么auto无法与std :: atomic一起使用?

来自分类Dev

为什么在C ++ std :: string中将Unicode字符视为相同?

来自分类Dev

为什么最后一个字符是“?” 在这个字符串函数中

来自分类Dev

为什么不能在C ++中为std :: vector的字符串文字初始值设定项列表创建std :: vector <std :: string>?

来自分类Dev

为什么在C ++中当我用'+'合并字符串时不合并但删除字符串的第一个字符

来自分类Dev

为什么查询结果中缺少一个字符?

来自分类Dev

为什么putInt在Android Java中需要一个字符串?

来自分类Dev

为什么 exec(chr(8)) 不从 shell 中删除一个字符?

来自分类Dev

C ++:为什么不会用delete()删除字符串中的第一个字符?

来自分类Dev

如何在C ++中使用std :: string将一个字符替换为另一个字符?

来自分类Dev

如何在C ++中使用std :: string将一个字符替换为另一个字符?

来自分类Dev

在C中声明一个字符串/单词变量

来自分类Dev

为什么HttpRequestHeaders.GetValues(string)返回的IEnumerable只能有1个字符串?

来自分类Dev

循环一次在一个字符中创建字符串

来自分类Dev

从字符串中删除一个字符一次

来自分类Dev

文本框不接受超过1个字符,而不会在C#中消失

Related 相关文章

  1. 1

    为什么导航栏中的SwiftUI TextField一次只能接受一个字符的输入

  2. 2

    为什么sed一次不能匹配一个文件中的多个字符?

  3. 3

    从一个字符中构造std :: string的最佳方法是什么?

  4. 4

    在字符串C#中输出一个字符的一次出现

  5. 5

    为什么我一次只能从okhttp.Response InputStream中读取2048个字节?

  6. 6

    为什么使用 char 变量从文件中读取一个字符又吃了一个下一个字符?

  7. 7

    尝试从文件中打印随机行,但一次只能打印一个字符

  8. 8

    为什么 jquery datepicker 在同一个表单中只能工作一次?

  9. 9

    为什么SwiftUI中的Picker只能运行一次

  10. 10

    为什么在第二次迭代中跳过第一个字符

  11. 11

    如何从c中没有空格的字符串中一次获取一个字符?

  12. 12

    为什么string.TrimEnd不只删除字符串中的最后一个字符

  13. 13

    在C ++中,为什么auto无法与std :: atomic一起使用?

  14. 14

    在C ++中,为什么auto无法与std :: atomic一起使用?

  15. 15

    为什么在C ++ std :: string中将Unicode字符视为相同?

  16. 16

    为什么最后一个字符是“?” 在这个字符串函数中

  17. 17

    为什么不能在C ++中为std :: vector的字符串文字初始值设定项列表创建std :: vector <std :: string>?

  18. 18

    为什么在C ++中当我用'+'合并字符串时不合并但删除字符串的第一个字符

  19. 19

    为什么查询结果中缺少一个字符?

  20. 20

    为什么putInt在Android Java中需要一个字符串?

  21. 21

    为什么 exec(chr(8)) 不从 shell 中删除一个字符?

  22. 22

    C ++:为什么不会用delete()删除字符串中的第一个字符?

  23. 23

    如何在C ++中使用std :: string将一个字符替换为另一个字符?

  24. 24

    如何在C ++中使用std :: string将一个字符替换为另一个字符?

  25. 25

    在C中声明一个字符串/单词变量

  26. 26

    为什么HttpRequestHeaders.GetValues(string)返回的IEnumerable只能有1个字符串?

  27. 27

    循环一次在一个字符中创建字符串

  28. 28

    从字符串中删除一个字符一次

  29. 29

    文本框不接受超过1个字符,而不会在C#中消失

热门标签

归档