简单的C ++代码(这里有什么问题?)

时间:2009-08-29 16:53:09

标签: c++

Noob to C ++。

我正在尝试获取用户输入(姓氏,名字中间名),更改部分内容(中间名称为中间名称),然后重新排列它(First Middle Initial Last)。

我在哪里弄乱我的代码?

- 感谢您提供的任何帮助!

...

#include <iostream>
using std::cout;
using std::cin;

#include <string>
using std::string;

int main()
{

  string myString, last, first, middle;

  cout << "Enter your name: Last, First Middle";

  cin >> last >> first >> middle;

  char comma, space1, space2;

  comma = myString.find_first_of(',');
  space1 = myString.find_first_of(' ');
  space2 = myString.find_last_of(' ');

  last = myString.substr (0, comma); // user input last name
  first = myString.substr (space1+1, -1); // user input first name
  middle = myString.substr (space2+1, -1); // user input middle name

  middle.insert (0, space2+1); // inserts middle initial in front of middle name
  middle.erase (1, -1); // deletes full middle name, leaving only middle initial

  myString = first + ' ' + middle + ' ' + last; //  

  return 0;
}

4 个答案:

答案 0 :(得分:14)

你在myString中搜索的东西,但从未将它设置为任何东西(它是一个空字符串)。

你应该读一整行到myString

std::getline(std::cin, myString); 

然后你可以留意,和空格等。第二个问题是你应该使用size_t作为逗号,space1和space2的类型。这些将空格和逗号的位置保留在字符串中:如果在输入中找不到逗号或空格,则查找函数将返回string::npos,这是size_t中的最高值。但这会溢出char。为了可靠地分配位置,您应该将这三个变量的类型更改为size_t

然后,而不是使用-1来表示你想要提取一个子字符串,直到结束只是省略它:它有一个指定string::npos的参数的默认参数。如果你真的想传递它,可能是因为它提高了你的可读性,请使用string::npos代替它:它有正确的类型(size_t),并且不需要int的转换(值-1)。

答案 1 :(得分:12)

不应该这一行:

cin >> last >> first >> middle;

cin >> myString;

因为之后您在myString中搜索逗号和空格,但此字符串不包含任何内容。

答案 2 :(得分:1)

我修复了你的代码!

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

int main()
{

  string myString, last, first, middle;

  cout << "Enter your name: Last, First Middle" << endl;

  getline(cin, myString);

  char comma, space1, space2;

  comma = myString.find_first_of(',');
  space1 = myString.find_first_of(' ');
  space2 = myString.find_last_of(' ');

  last = myString.substr (0, comma); // user input last name
  first = myString.substr (space1+1, space2 - space1); // user input first name
  middle = myString.substr (space2+1, -1); // user input middle name

  middle.erase(1, -1); // erases full middle name, only leaving the first character as initial

  cout << first << " " << middle << ". " << last << endl;//displays output

  return 0;
}

更简单的方法是声明整个命名空间。

using namespace std;

如果要在输入字符串中包含空格,请尝试使用getline()

getline(cin, myString);

就在这里,你不应该使用-1作为你的第二个参数,否则很高兴会为first分配其余的字符串输入。

first = myString.substr (space1+1, space2 - space1);

此外,函数middle.erase不能真正接受char作为参数,更好的方法是编写-1,因为你试图摆脱一切后的所有内容第一个字符。

middle.erase(1, -1);

最后,myString = first + ' ' + middle + ' ' + last;没有,只是没有。我假设您正在尝试显示结果,std::cout会很好。

cout << first << " " << middle << ". " << last << endl;

答案 3 :(得分:0)

此外,您可以只包含名称空间using,而不是删除这么多std语句 ,所以看起来应该是这样的。

//include headers..
using namespace std;