相当于 c++ 中的 Console.ReadLine()

Posted

技术标签:

【中文标题】相当于 c++ 中的 Console.ReadLine()【英文标题】:equivalent of Console.ReadLine() in c++ 【发布时间】:2012-09-30 03:55:03 【问题描述】:

我的老师刚刚给了我一个 C++ 作业,我正在尝试使用 scanf 获取一个字符串,但它只能输入最后一个字符。任何人都可以帮助我吗?我正在寻找 c++ 中的 console.readline() 的等价物。

编辑:我还必须能够通过指针存储值。

所以图片显示了当前在后台运行的代码,它应该在没有保证的情况下停止:并等待输入,但它跳过了它。

getline(cin, ptrav->nam);有效,但由于某种原因它跳过了一行......

【问题讨论】:

在 C/C++ 中 => fgets,在 C++ 中 => std::getline 不要使用代码截图,制作一个只包含相关代码的示例,并描述您的输入,以及期望的和实际的输出。基本上,在发布“我有这个但它坏了”之外的问题之前,先做一些隔离/诊断你的问题的工作。 【参考方案1】:

您正在寻找std::getline()。例如:

#include <string>
std::string str;
std::getline(std::cin, str);

我不太明白你说的是什么意思我还必须能够通过指针存储值

更新:看看你更新的问题,我可以想象发生了什么。读取选项的代码(即数字 1、2 等)没有读取换行符。然后你调用 getline 来消耗换行符。然后你再次调用getline 来获取字符串。

【讨论】:

是的,我相信 scanf() 将单词读取为字符串。 fgets(..., stdin) 也可以工作。 这些是 C 函数。处理C字符串。 C++ 字符串就是我们想要的。 "string with scanf" 我读为 char *foo;不是 std::string foo;我猜“通过指针”也意味着空终止的 C 样式字符串。 好的,你可以这样做:getline(cin, ptrav-&gt;nam)。那是因为字符串参数是通过引用getline来传递的。 屏幕截图不允许我们运行您的代码。创建尽可能小的程序来说明您的问题并将其发布。我认为这将是一个新问题。我认为您在这里提出的问题已经得到解答。【参考方案2】:

根据MSDN, Console::ReadLine:

Reads the next line of characters from the standard input stream.

C++ 变体(不涉及指针):

#include <iostream>
#include <string>

 int main()

 std::cout << "Enter string:" << flush;
 std::string s;
 std::getline(std::cin, s);
 std::cout << "the string was: " << s << std::endl;


C-Variant(带有缓冲区和指针),也 适用于 C++ 编译器,但不应使用:
 #include <stdio.h>
 #define BUFLEN 256

 int main()

 char buffer[BUFLEN];   /* the string is stored through pointer to this buffer */
 printf("Enter string:");
 fflush(stdout);
 fgets(buffer, BUFLEN, stdin); /* buffer is sent as a pointer to fgets */
 printf( "the string was: %s", buffer);


根据您的代码示例,如果您有一个结构 patient (在大卫赫弗曼的评论后更正):
struct patient 
   std::string nam, nom, prenom, adresse;
;

然后,以下应该可以工作(通过逻辑思维在附加问题为solved by DavidHeffernan 之后添加ios::ignore)。请不要在您的代码中完全使用scanf

...
std::cin.ignore(256); // clear the input buffer

patient *ptrav = new patient;

std::cout << "No assurance maladie : " << std::flush;
std::getline(std::cin, ptrav->nam);
std::cout << "Nom : " << std::flush;
std::getline(std::cin, ptrav->nom);
std::cout << "Prenom : " << std::flush;
std::getline(std::cin, ptrav->prenom);
std::cout << "Adresse : " << std::flush;
std::getline(std::cin, ptrav->adresse);
...

【讨论】:

以上是关于相当于 c++ 中的 Console.ReadLine()的主要内容,如果未能解决你的问题,请参考以下文章

关于C#输入和输出的语句,控制台

连接到信号集线器

相当于 c++ 中的 Console.ReadLine()

.Net 7 的AOT的程序比托管代码更容易破解?

c++中的struct和class的区别是啥??

为什么我的while循环执行,即使条件是不是真的?