输出出错

  • 本文关键字:出错 输出 c++ cin
  • 更新时间 :
  • 英文 :


我目前正在自学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: ";
}

相关内容

最新更新