0

好吧,我必须编写一个程序来拆分字符串的元素。然后打印这些话。我面临一些问题: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

4 回答 4

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

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

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(".,;!? "));
于 2013-07-30T20:47:33.853 回答
1

阅读函数 strtok。它是老派,但非常易于使用。

于 2013-07-30T20:43:34.187 回答
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++,一旦你尝试过,你就再也不会回来了!

于 2013-07-30T20:44:31.087 回答
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;
}
于 2013-07-30T21:18:18.977 回答