2010-02-02 41 views
1

充分利用用户输入我使用的Turbo C++ 3.0编译器使用CIN

在使用下面的代码..

char *Name; 
cin >> Name; 
cout << Name; 

当我用了空间输入...唯一可取的字符空间之前输入.. 如果我给了输入“QWERT YUIOP”...名称将包含“QWERT”;

任何解释为什么?

+3

转储Turbo C++,使用更好的编译器。 – 2010-02-02 13:14:39

回答

2

您需要为要读取名称的char数组分配空间。 char *Name;将不起作用,因为它只声明char指针而不是char数组。类似于char Name[30];

另外cin <<只允许我们在字符串中输入一个单词(char name [30])。
但是,有一个cin函数可以读取包含空格的文本。直到最大字符都 被读取或到达行字符(“\ n”)结束,并把它们 到名字变量

cin.get(name, MAX) 

get会阅读所有的字符,包括空格。

+0

cin.get在缓冲区中留下分隔符(“\ n”),这通常不是你想要的。这就是为什么使用cin.getline(name,MAX)更好一些。 – Manuel 2010-02-02 14:07:01

1

你刚刚声明了一个不指向任何东西的字符指针。你需要为你的字符串分配空间。最常用的方法是在栈上分配空间,IE:

char Name[50]; 

记住一个字符指针本身就是把一个地址到真正的存储是一个地方。您仍然需要获取一块内存并将地址存储在指针中。上面的代码在堆栈上创建了一个名称数组,您可以使用Name存储多达49个字符以及一个空终端。

或者,对于可变长度的字符串,使用std :: string。

+0

鉴于他的编译器大约15岁,它不会有'std :: string'。你会想要一个来自21世纪的编译器。 – MSalters 2010-02-02 13:54:08

+0

@ MSalters哈哈好点。没有看到编译器:) – 2010-02-02 23:55:56

5

当使用cin读取字符串时,除非另有指定,否则它会自动以空格分隔。

std::string s; 
std::cin >> noskipws >> s; 

另外,如果你想获得一整行,然后使用:

std::getline(cin, s); 

您也想为原料char阵列分配存储空间,但与C++,你应该使用std::stringstd::wstring无论如何。

+0

提及'getline'的+1。 – 2010-02-02 13:20:42

+0

@Poita_:我不认为你明白noskipws是如何工作的。 如果您使用“cin >> noskipws >> str”,并且用户输入“a b c”,则str将包含“a”,其余输入将会丢失。 如果您想要用整个空格读取整个文本,必须使用getline()。 – Manuel 2010-02-02 13:49:37