You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中无法用cout输出string变量,求助排查代码问题

C++结构体数据无法输出的问题解决

问题根源

你代码里的getinfo()和showresult()函数各自定义了局部的moviedata变量,这两个变量完全独立:

  • getinfo()中输入的电影数据只存储在它自己的局部m里,函数执行完毕后这个变量就会被销毁
  • showresult()里的m是全新的未初始化变量,自然无法输出你输入的title、director等数据

解决方案

要让两个函数共享同一个moviedata对象,有两种常用且规范的方式:

方式1:使用引用参数(推荐)

在main函数中创建一个moviedata变量,然后将它的引用传递给getinfo()和showresult(),这样两个函数操作的是同一个对象:

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

struct moviedata
{
    string title;
    string director;
    int year_released;
    double run_time;
};

// 修改函数参数为引用
void getinfo(moviedata& m);
void showresult(const moviedata& m); // 只读场景用const引用更安全

int main()
{
    moviedata m; // 在main中创建结构体变量
    getinfo(m);
    showresult(m);
    return 0;
}

void getinfo(moviedata& m)
{
    cout << "What is title of movie?"<<endl;
    cin >> m.title;

    cout << "Who is the director of " << m.title << " ?"<<endl;
    cin >> m.director;

    cout << "What year was it released?"<<endl;
    cin >> m.year_released;

    cout << "What is the run time of " << m.title <<" ?"<<endl;
    cin >> m.run_time;
}

void showresult(const moviedata& m)
{
    cout << "You selected " << m.title << " directed by " << m.director ;
    cout << " which was released in " << m.year_released << " and is " << m.run_time <<" hours long"<<endl;
}

方式2:让函数返回结构体

修改getinfo()的返回类型为moviedata,把输入好的结构体返回给main,再传递给showresult():

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

struct moviedata
{
    string title;
    string director;
    int year_released;
    double run_time;
};

moviedata getinfo();
void showresult(const moviedata& m);

int main()
{
    moviedata m = getinfo();
    showresult(m);
    return 0;
}

moviedata getinfo()
{
    moviedata m;

    cout << "What is title of movie?"<<endl;
    cin >> m.title;

    cout << "Who is the director of " << m.title << " ?"<<endl;
    cin >> m.director;

    cout << "What year was it released?"<<endl;
    cin >> m.year_released;

    cout << "What is the run time of " << m.title <<" ?"<<endl;
    cin >> m.run_time;

    return m; // 返回填充好的结构体
}

void showresult(const moviedata& m)
{
    cout << "You selected " << m.title << " directed by " << m.director ;
    cout << " which was released in " << m.year_released << " and is " << m.run_time <<" hours long"<<endl;
}

额外提示

  • cin >> string只能读取到空格前的内容,如果电影名或导演名包含空格(比如"The Matrix"),会只读取部分内容,这种场景需要用getline(cin, m.title)读取整行,但要注意处理输入缓冲区残留的换行符。
  • 尽量避免用全局变量共享数据,会降低代码的可维护性和可读性。

内容的提问来源于stack exchange,提问作者Anonymous 18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:10:57