数组大小和字符串拆分

时间:2013-07-30 20:41:16

标签: c++ string split

好的家伙我必须制作一个程序来分割字符串的元素。然后打印那些文字。 我面临一些问题: 1)数组打印超过字符串中单词的大小我希望它一旦打印完最后一个字就应该结束打印。我试图阻止它,但它总是给我运行时错误,当我试图打破最后一个字。 2)有没有其他有效的分割和打印方式???

#include <sstream>
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include <string>   

using namespace std;

int main()
{
    std::string line;
    std::getline(cin, line);
    string arr[1000];
    int i = 0;
    int l=line.length();
    stringstream ssin(line);

    while (ssin.good() && i < l)
    {
        ssin >> arr[i];
        ++i;
    }

    int size = sizeof(arr) / sizeof(arr[0]);

    for(i = 0; i <size; i++){
        cout << arr[i] << endl;
    }

    return 0;
}

4 个答案:

答案 0 :(得分:3)

int size = sizeof(arr) / sizeof(arr[0]);

这是一个编译时间值,它始终是数组中元素的数量(1000)。它不知道你在循环中分配了多少个字符串。您在i变量中存储了成功读取的字符串数(加1),因此您可以这样做:

int size = i - 1;

但如果由我决定,我会使用一个可扩展的结构,如vector(#include <vector>

std::vector<std::string> arr;
std::string temp;
while (ssin >> temp)
{
    arr.push_back(temp);
}

for (auto const & str : arr)
{
    std::cout << str << std::endl;
}

/* If you're stuck in the past (can't use C++11)
    for (std::vector<std::string>::iterator = arr.begin(); i != arr.end(); ++i)
    {
        std::cout << *i << std::endl;
    }
*/

对于基于通用字符的拆分,我更喜欢boost::split(我知道您不能使用它,但供将来参考)

std::vector<std::string> arr;
boost::split(arr, line, boost::is_any_of(".,;!? "));

答案 1 :(得分:1)

阅读strtok函数。这是老派但很容易使用。

答案 2 :(得分:0)

1)您应该对您的计划进行一些更改:

  #include <sstream>
  #include <iostream>
  #include <string>   
  using namespace std;
  int main()
  {
    std::string line("hello string world\n");
    string arr[1000];
    int i = 0;
    stringstream ssin(line);
    while (ssin.good() && i < 1000)
    {
      ssin >> arr[i++];
    }
    int size = i-1;
    for(i = 0; i < size; i++){
      cout << i << ": " << arr[i] << endl;
    }
    return 0;
  }

即,您不想打印sizeof(arr)/sizeof(arr[0])(即1000)元素。条件i < l

没有意义

2)stringstream如果你只想分开单个字符串就可以了;如果需要更多,请使用boost/tokenizer分割字符串。它是现代的c ++,一旦你尝试它,你将永远不会回来!

答案 3 :(得分:0)

这是我认为现在不用担心的最佳方法

#include <sstream>
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include <cstring>
#include <string>   
using namespace std;
int main ()
{
std::string str;
std::getline(cin, str);
string arr[100];
int l=0,i;

char * cstr = new char [str.length()+1];
std::strcpy (cstr, str.c_str());

 // cstr now contains a c-string copy of str

char * p = std::strtok (cstr,".,;!? ");
while (p!=0)
 {
//std::cout << p << '\n';
arr[l++]=p;
p = strtok(NULL,".,;!? ");
}
for(i = 0; i <l; i++)
{
    cout << arr[i] << endl;
}

delete[] cstr;
return 0;
}