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
相关产品推荐
相关产品推荐

