18

截屏 我的老师刚刚给了我一个 c++ 作业,我试图用 scanf 获取一个字符串,但它只输入最后一个字符。任何人都可以帮助我吗?我正在寻找与 c++ 中的 console.readline() 等效的东西。

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

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

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

4

2 回答 2

36

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

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

当您说我还必须能够通过指针存储值时,我几乎不知道您的意思。

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

于 2012-10-09T18:49:26.777 回答
7

根据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;
};

然后,以下应该起作用(在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);
...
于 2012-10-09T19:11:58.703 回答