5

如果这是一个重复的问题,我很抱歉,但我已经尝试寻找答案并且空手而归。所以基本上我只想将字符串(单个单词)添加到向量的后面,然后将存储的字符串显示为单个字符串。我是个菜鸟。

#include <iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;


int main(int a, char* b [])
{
    vector<string> userString;      
    string word;        
    string sentence = "";           
    for (decltype(userString.size()) i = 0; i <= userString.size() - 1; i++)
    {
        cin >> word;
        userString.push_back(word);
        sentence += userString[i] + " ";
    }
    cout << sentence;
    system("PAUSE");
    return 0;
}

为什么这不起作用?

编辑

int main(int a, char* b [])
{
    cout << "Enter a sequence of words. Enter '.' \n";
    vector<string> userString;      
    string word;                    
    string sentence = "";           /
    int wordCount = 0;
    while (getline(cin, word))
    {
        if (word == ".")
        {
            break;
        }
        userString.push_back(word);
    }
    for (decltype(userString.size()) i = 0; i <= userString.size() - 1; i++)
    {
        sentence += userString[i] + " ";
        wordCount += 1;
        if (wordCount == 8)
        {
            sentence = sentence + "\n";
                    wordCount = 0;
        }
    }
    cout << sentence << endl; 
    system("PAUSE");
    return 0;
}

所以我的新程序有效。它只是将值放在向量的后面并将它们打印出 8 个单词到一行。我知道有更简单的方法,但我只是在学习向量,而且我会一步一步来。谢谢你们的帮助。

4

6 回答 6

8

因为 userString 是空的。你只声明它

vector<string> userString;     

但永远不要添加任何东西,所以 for 循环甚至不会运行。

于 2013-07-30T04:14:22.683 回答
5

vector<string> userString有 size 0,所以永远不会进入循环。您可以从给定大小的向量开始:

vector<string> userString(10);      
string word;        
string sentence;           
for (decltype(userString.size()) i = 0; i < userString.size(); ++i)
{
    cin >> word;
    userString[i] = word;
    sentence += userString[i] + " ";
}

虽然不清楚为什么你需要向量:

string word;        
string sentence;           
for (int i = 0; i < 10; ++i)
{
    cin >> word;
    sentence += word + " ";
}

如果您不想对输入字数有固定限制,可以std::getlinewhile循环中使用,检查某个输入,例如"q"

while (std::getline(std::cin, word) && word != "q")
{
    sentence += word + " ";
}

这将添加单词,sentence直到您键入“q”。

于 2013-07-30T04:13:54.853 回答
3

您必须使用向量 STL 中存在的插入方法插入元素,检查以下程序以将元素添加到其中,您可以在程序中以相同的方式使用。

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

int main ()
{
  std::vector<std::string> myvector ;
  std::vector<std::string>::iterator it;

   it = myvector.begin();
  std::string myarray [] = { "Hi","hello","wassup" };
  myvector.insert (myvector.begin(), myarray, myarray+3);

  std::cout << "myvector contains:";
  for (it=myvector.begin(); it<myvector.end(); it++)
    std::cout << ' ' << *it;
    std::cout << '\n';

  return 0;
}
于 2013-07-30T04:49:32.887 回答
1

你问了两个问题;你的标题说“显示字符串向量”,但你实际上并没有这样做,你实际上构建了一个由所有字符串组成的单个字符串并输出它。

您的问题主体询问“为什么这不起作用”。

它不起作用,因为您的 for 循环受 0 的“userString.size()”约束,并且您测试循环变量是否为“userString.size() - 1”。在允许执行第一次迭代之前测试 for() 循环的条件。

int n = 1;
for (int i = 1; i < n; ++i) {
    std::cout << i << endl;
}

不会打印任何内容。

因此,您的循环完全不执行任何迭代,将 userString 和句子留空。

最后,您的代码使用向量的理由绝对为零。您使用“decltype(userString.size())”而不是“size_t”或“auto”这一事实,同时声称自己是新手,这表明您要么是从后到前阅读一本书,要么是在设置自己不及格。

因此,在您的帖子末尾回答您的问题:它不起作用,因为您没有使用调试器单步执行它并检查它的值。虽然我开玩笑地说,但我会把它留在那里。

于 2013-07-30T05:23:00.170 回答
0

vector.size()返回向量的大小。您没有在循环之前将任何字符串放入向量中,因此向量的大小为0。它永远不会进入循环。首先在向量中放入一些数据,然后尝试添加它们。您可以从用户那里获取用户想要输入的字符串数量。

#include <iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;


int main(int a, char* b [])
{
    vector<string> userString;
    string word;
    string sentence = "";
    int SIZE;
    cin>>SIZE;    //what will be the size of the vector
    for (int i = 0; i < SIZE; i++)
    {
        cin >> word;
        userString.push_back(word);
        sentence += userString[i] + " ";
    }
    cout << sentence;
    system("PAUSE");
    return 0;
}

另一件事,实际上您不必使用向量来执行此操作。两个字符串可以为您完成这项工作。

#include <iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;


int main(int a, char* b [])
{
   // vector<string> userString;
    string word;
    string sentence = "";
    int SIZE;
    cin>>SIZE;    //what will be the size of the vector
    for (int i = 0; i < SIZE; i++)
    {
        cin >> word;
        sentence += word+ " ";
    }
    cout << sentence;
    system("PAUSE");
    return 0;
}

如果您想在用户希望之前输入字符串,代码将如下所示:

#include <iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;


int main(int a, char* b [])
{
   // vector<string> userString;
    string word;
    string sentence = "";
    //int SIZE;
    //cin>>SIZE;    //what will be the size of the vector
    while(cin>>word)
    {
        //cin >> word;
        sentence += word+ " ";
    }
    cout << sentence;
  //  system("PAUSE");
    return 0;
}
于 2013-07-30T04:32:00.297 回答
0

不过,此代码无需任何修改即可工作。

来源: https ://gist.github.com/lucianmachado/9a26d5745497ffe5d054

#include <glob.h>
#include <vector>
#include <string>
inline std::vector<std::string> glob(const std::string& pat){
    using namespace std;
    glob_t glob_result;
    glob(pat.c_str(),GLOB_TILDE,NULL,&glob_result);
    vector<string> ret;
    for(unsigned int i=0;i<glob_result.gl_pathc;++i){
        ret.push_back(string(glob_result.gl_pathv[i]));
    }
    globfree(&glob_result);
    return ret;
}

像这样使用它:

glob("pattern");

“模式”也可以是 string.c_str()。它还返回字符串,因此您也可以在字符串变量中捕获它。

于 2021-11-22T01:24:21.293 回答