0

嘿伙计们,所以我有一个班级作业,我必须拆分一个字符串并对其进行操作。但是,当我尝试拆分字符串并将其分配给数组时,只有第一个元素出现,而其他两个没有。请帮忙。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
    string str;
    cout<<"Enter a first name, middle initial, last name: ";
    cin>> str;
    string word;
    string array[3];
    stringstream stream(str);
    int counter = 0;
    while( getline(stream, word, ' ') )
    {
        cout<<word;
       array[counter] = word;

       counter++;
    }
    cout<<"The "<<array[0].length()<<" characters of the first name are: "<<array[0]<<endl;
    cout<<"The "<<array[2].length()<<" characters of the last name are: "<<array[2]<<endl;
    string newstring = array[2]+", "+array[0]+" "+array[1];
    cout<<"In the phone book, the name would be: "<<newstring<<endl;
    cout<<"The length of the name is: "<<newstring.length()<<endl;
    cout<<"The comma is at position: "<<newstring.find(",")<<endl;
    array[0].swap(array[2]);
    cout<<"After the swap, the last name is "<<array[2]<<" and the first name is "<<array[0];

    system("pause");
    return 0;

}
4

1 回答 1

2

您的代码中有一些明显的错误:

  1. 尝试阅读后,您需要始终检查您的输入!您可以使用while-loop 执行此操作,但您还需要先验证您实际上是否成功读取了字符串。
  2. 似乎您正在混合输入运算符的用途std::stringstd::getline()正在做的事情:输入运算符在跳过前导空格后读取第一个单词,同时std::getline()读取一行(是否可以将行终止符指定为第三个参数)。
  3. 读取固定大小的数组时,您始终需要确保读取的内容不超过该数组的大小!您可能对黑客通过使用缓冲区溢出来利用软件感到担忧:假设您实际上确实首先阅读了一行,然后将其拆分为您已经创建了其中一个可利用程序的单词!如果您不想在每个单词之前检查数组中是否有足够的空间,您可以使用,例如,a std::vector<std::string>(这样做对黑客来说也有问题,即它打开了拒绝服务的程序攻击,但尽管这仍然是一个问题,但它是一个较小的问题)。

您的程序也存在一些小问题:

  1. 如果您只是从字符串流中读取,则应该使用std::istringstream,因为不需要同时设置std::stringstream.
  2. 程序要求输入“名字、中间名和姓氏”。我会阅读该规范以使用例如“John, F., Kennedy”,但您似乎希望使用“John F. Kennedy”。我希望使用逗号的一个原因是我没有中间名,即我会输入“Dietmar, , Kühl”。
于 2013-09-15T02:39:51.403 回答