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;
}
答案 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;