我目前正在自学c/c ,我得到了练习(从我正在阅读的书中)编写一个可以产生这样的输出的程序:
Enter your first name: Flip
Enter your last name: Fleming
Here’s the information in a single string: Fleming, Flip
使用结构。但是我的输出出现了:
Enter your first name: Flip
Enter your last name: Fleming
Here’s the information in a single string: ,
这是代码。它相当简单又简单,因此不难阅读:)
#include <iostream>
#include <cstring>
using namespace std;
struct Person {
char* firstName;
char* lastName;
};
char* getName(void);
int main() {
Person* ps = new Person;
cout << "Enter your first name: ";
char* name;
name = getName();
ps->firstName = name;
cout << "Enter your last name: ";
char* lastname;
lastname = getName();
ps->lastName = lastname;
cout << "Here's the information in a single string: "
<< ps->lastName << ", " << ps->firstName;
delete ps;
delete name;
delete lastname;
return 0;
}
char* getName() {
char temp[100];
cin >> temp;
cin.getline(temp, 100);
char* pn = new char[strlen(temp) + 1];
strcpy(pn, temp);
return pn;
}
首先,没有C/C 的内容。您正在混合它们,这是错误的。由于您使用的是C 标头/new
/using
,因此我假设您想要C ,所以这是修复代码的方式:
- 用
std::string
替换所有char*
和char[]
- 摆脱动态分配
所以,一些更改将是:
struct Person {
std::string firstName;
std::string lastName;
};
或
Person ps;
您正在使用:
cin >> temp;
cin.getline(temp, 100);
您可能在行末端用空字符串覆盖了您已经拥有的东西。
仅使用其中之一。
如果您坚持使用cin >>
,则可以考虑设置width()
以防止缓冲区溢出。
首先,直接的问题是您从 std::cin
:首先读取两次,首先是用 operator>>
读取,然后用 getline
读取。选择一个或另一个。
,但让我们简化您的代码。错误来源太多。指针很棘手,因为它们可能指出了错误的事情,或者您可能会忘记删除对象或将它们删除两次。C风格的char阵列作为字符串很糟糕,因为它们不是字符串,它们的行为不像弦。
所以让我们使用标准库的字符串类:
#include <iostream>
#include <string>
struct Person {
std::string firstName;
std::string lastName;
};
std::string getName(void);
int main() {
Person ps;
cout << "Enter your first name: ";
std::string name = getName();
ps.firstName = name;
cout << "Enter your last name: ";
std::string lastname = getName();
ps.lastName = lastname;
cout << "Here's the information in a single string: "
<< ps.lastName << ", " << ps.firstName;
}
std::string getName() {
std::string temp;
std::getline(cin, temp);
return temp;
}
这是一个相当简单的,几乎是机械的,基本上只是用std::string
替换char*
,并删除不再需要的位。
当然,正如评论中指出的那样,我省略了所有错误检查形式,真正的程序绝对应该做。
不,不,wayyyy太复杂了。使用真实的C 成语。该程序可能很简单:
#include <string>
#include <iostream>
int main()
{
std::string firstName, lastName;
if (!(std::cout << "Your first name: " &&
std::getline(std::cin, firstName) &&
std::cout << "Your last name: " &&
std::getline(std::cin, lastName) ))
{
std::cerr << "Error: unexpected end of input!n";
return 0;
}
std::cout << "You are " << firstName << " " << lastName << ".n";
}
作为主题的变化,您可以将每个getline
放在循环中,直到用户输入非空线:
std::cout >> "Your first name: ";
for ( ; ; )
{
if (!(std::getline(std::cin, firstName))
{
std::cerr << "Error: unexpected end of input.n";
return 0;
}
if (!firstName.empty())
{
break;
}
std::cout << "Sorry, please repeat - your first name: ";
}