C++中的"cin"只能读取第一个单词

6
#include<iostream.h>
#include<conio.h>
class String
{
    char str[100];
    public:
    void input()
    {
        cout<<"Enter string :";
        cin>>str;
    }

    void display()
    {
        cout<<str;
    }
};

int main()
{
     String s;
     s.input();
     s.display();
     return 0;
}

我正在使用Turbo C++ 4.5进行开发。代码可以正常运行,但输出结果不符合预期,例如当我输入"steve hawking"时只会显示"steve"。请问有人能帮忙吗?


这行代码 cin<<str 甚至无法编译通过。而且为什么要打上 cjava 的标签呢? - interjay
2
你为什么要使用一个20年前的集成开发环境呢?现在有很多更现代化、编译器更好的免费IDE可供选择,比如NetBeans、Eclipse、Visual Studio Express等。 - Brendan Long
5个回答

26

在流上使用>>会一次读取一个单词。要将整行读入char数组中:

cin.getline(str, sizeof str);

当然,一旦你学会了如何实现字符串,你应该使用 std::string 并将其读作

getline(cin, str);

最好从本世纪获取一个编译器,因为您的编译器已经超过15年了,并且自那时以来C++发生了重大变化。如果您想要Windows的免费编译器,Visual Studio Express是一个不错的选择;还有其他编译器可供选择。


4
cin>>str;

这只读取下一个标记。在 C++ iostreams 中,标记由空格分隔,因此您将获得第一个单词。

您可能需要使用getline,它会将整行内容读入一个字符串:

getline(cin, str);

那么如何将整个句子作为输出呢? - rick
1
应该使用'cin>>str'而不是'cin<<str'。 - xikkub

2
你可以使用:

   cin.read( str, sizeof(str) );

但是,这会填满缓冲区。相反,你应该像MikeSeymour建议的那样使用cin.getLine()


1
read 会填满整个缓冲区;你需要使用 getline 读取到行末。 - Mike Seymour
你是对的,它会填满整个缓冲区。 - roymustang86
1
std::noskipws并不像你所暗示的那样起作用。它只影响初始空格,而不是终止空格。 - Robᵩ

1
你可以使用cin.getline来读取整行内容。

0
使用这个。
cin.getline(cin, str);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接