谁能告诉我我的代码有什么问题吗?

时间:2019-01-28 15:51:16

标签: c++ c++11

我是编程和c ++的新手。如果这听起来很愚蠢,那么您知道为什么。 我的代码有问题。由于某种原因,当我创建函数来实现此功能时,并非所有4个字母的字符串都不会进入我的数组。加, 具有6个字母的字符串也进入我的数组,这些数组只能存储4个或用户想要放置的任何内容。

我已经做了很多尝试,甚至无法列出来。

#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

int main()
{
    string LetterInput, LetterLoad, input;
    string Words[] = {"camera","lotion","fire","eggs","roll"};
    string PossibleAnswers[] = {};
    int Number;
    int Size;
    bool YesorNo = false;

cout << "Lets play HANGMAN! " << endl;
Sleep(500);

cout << "Think of a word and type in the number" << endl;
cout << "of letters there are" << endl;
cin >> Size;

for (int i = 1; i <= Size; i++){
    LetterLoad += "_";
}

for (int i = 0; i <= sizeof(Words)/sizeof(string); i++){
    if (Size == Words[i].size()){
        PossibleAnswers[i] = Words[i];
    }
}

cout << PossibleAnswers[0] << endl;
cout << PossibleAnswers[1] << endl;

我的预期结果是该数组仅按该顺序显示"fire","eggs","rolls"。但是实际结果是"camera","lotion","fire","eggs"。大声笑是什么问题。

2 个答案:

答案 0 :(得分:3)

这是您的代码更正。如评论中所述,最简单的方法是使用std::vector而不是数组。通常,在C ++中应避免使用数组。

#include <vector>

...

vector<string> Words{"camera","lotion","fire","eggs","roll"};
vector<string> PossibleAnswers;

...

for (size_t i = 0; i < Words.size(); i++){
    if (Size == Words[i].size()){
        PossibleAnswers.push_back(Words[i]);
    }
}

请注意使用push_back向矢量添加项目。这是数组无法做到的,因为数组始终是固定大小的。这是你的基本错误。

答案 1 :(得分:0)

您有多个问题。其中大多数是由于您的老式C ++代码。始终使用最新的可用标准,在您的情况下可能是C ++ 14甚至C ++ 17。

简而言之:使用std::vector

始终避免使用原始数组。改用标准库的容器类,它们会使您的生活更轻松。在这种情况下,std::vector应该是您的选择,因为它易于使用并且可以动态分配(可调整大小)数组。

std::vector<std::string> words {"camera","lotion","fire","eggs","roll"};
std::vector<std::string> possible_answers;

当前,您使用空数组PossibleAnswers,这意味着您内部没有任何元素。但是-您尝试使用这些元素。 相反,请尝试以下操作:

for(i = 0; i < words.size(); ++i)
    if(size_input == words[i].size())
        possible_answers.push_back(words[i]);

您必须使用#include <vector>才能使用矢量。

相对于Sleep(500),我更喜欢std :: this_thread :: sleep_for(std :: chrono ::毫秒(500))。如果标准中有替代功能,请尝试避免使用特定于平台的功能。 要使用此功能,请包含标题<thread>