Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单C++;代码(这里怎么了?) < C++ > N/OP>_C++ - Fatal编程技术网

简单C++;代码(这里怎么了?) < C++ > N/OP>

简单C++;代码(这里怎么了?) < C++ > N/OP>,c++,C++,我正在尝试获取用户输入(姓、名、中间名),将其中的一部分(中间名改为中间首字母),然后重新排列(第一个中间首字母最后一个) 我在哪里把代码弄乱了 --谢谢你能提供的任何帮助 #包括 使用std::cout; 使用std::cin; #包括 使用std::string; int main() { 字符串myString,last,first,middle; cout>最后>>第一>>中间; 字符逗号,空格1,空格2; 逗号=myString.find_first_of(','); space1=

我正在尝试获取用户输入(姓、名、中间名),将其中的一部分(中间名改为中间首字母),然后重新排列(第一个中间首字母最后一个)

我在哪里把代码弄乱了

--谢谢你能提供的任何帮助

#包括
使用std::cout;
使用std::cin;
#包括
使用std::string;
int main()
{
字符串myString,last,first,middle;
cout>最后>>第一>>中间;
字符逗号,空格1,空格2;
逗号=myString.find_first_of(',');
space1=myString.find_first_of(“”);
space2=myString.find_last_of(“”);
last=myString.substr(0,逗号);//用户输入姓氏
first=myString.substr(space1+1,-1);//用户输入名字
middle=myString.substr(space2+1,-1);//用户输入中间名
middle.insert(0,空格2+1);//在中间名前面插入中间首字母
middle.erase(1,-1);//删除完整的中间名,只保留中间的首字母
myString=first+''+middle+''+last;//
返回0;
}
这行不应该是:

cin >> last >> first >> middle;

?


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

您在
myString
中搜索内容,但从不将其设置为任何内容(它是一个空字符串)

您应该将整行内容读入
myString

std::getline(std::cin, myString); 
然后,您可以查找
和空格等。第二个问题是,您应该使用
size\t
作为逗号、空格1和空格2的类型。这些函数保留空格和逗号在字符串中的位置:如果在输入中找不到逗号或空格,则find函数返回
string::npos
,这是
大小中的最高值。但这会使
字符溢出。为了可靠地分配位置,您应该将这三个变量的类型更改为
size\t


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

也可以只包含名称空间
std
,所以它应该是这样的。

//include headers..
using namespace std;
我修正了你的密码

#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;
}
如果要在输入字符串中包含空格,请尝试使用
getline()

getline(cin, myString);
在这里,您不应该对第二个参数使用
-1
,否则
第一个
将很乐意分配其余的字符串输入

first = myString.substr (space1+1, space2 - space1);
另外,函数
middle.erase
不能真正接受字符作为参数,更好的方法是只写
-1
,因为您试图除去第一个字符之后的所有内容

middle.erase(1, -1);
最后,
myString=first+''+middle+''+last不要,只是不要。我假设您正在尝试显示结果,
std::cout
就可以了

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

cout这行不通,因为它会在第一个空格处停止读取行。这怎么会得到这么多赞成票。。。除非他们输入没有空格的名字,否则这是行不通的…@DeusAduro我也不明白,这就是为什么我对litb的评论和anwser投了赞成票。JW应该接受litb的答案,这样它就会出现在页面中并突出显示。
first = myString.substr (space1+1, space2 - space1);
middle.erase(1, -1);
cout << first << " " << middle << ". " << last << endl;