字符序列与字符数组(二)

当我们为数组myword的元素单独赋值时:

myword[0] = 'B';
myword[1] = 'y';
myword[2] = 'e';
myword[3] = ' ';

正如你可能想到的,这并不是一个实用的方法。通常给数组赋值,或更具体些,给字符序列赋值的方法是使用一些函数,例如strcpy

strcpy (string copy) 在函数库cstring (string.h) 中被定义,可以用以下方式被调用:

strcpy (string1, string2);

这个函数把string2 中的内容拷贝给string1。string2 可以是一个数组,一个指针,或一个字符串常量(constant string)。因此用下面的代码可以将字符串常量"Hello"赋给mystring:

strcpy (mystring, "Hello");  例如:

// setting value to string
#include <iostream>
#include <string>

int main () {
char MyName [20];
strcpy (MyName,"J. Soulie");
cout <<MyName;
return 0;
J. Soulie
                     注意我们需要包括头文件才能够使用函数strcpy

另一个给数组赋值的常用方法是直接使用输入流(cin)。在这种情况下,字符序列的值是在程序运行时由用户输入的。

当cin 被用来输入字符序列值时,它通常与函数getline 一起使用,方法如下:

cin.getline ( char buffer[], int length, char delimiter = ' 
');

这里buffer 是用来存储输入的地址(例如一个数组名),length 是一个缓存buffer 的最大容量,而delimiter 是用来判断用户输入结束的字符,它的默认值(如果我们不写这个参数时)是换行符newline character (' ')。

下面的例子重复输出用户在键盘上的任何输入。这个例子简单的显示了如何使用cin.getline来输入字符串:

// cin with strings
#include <iostream>

int main () {
char mybuffer [100];
cout << "What's your name? ";


cin.getline (mybuffer,100);


cout << "Hello " << mybuffer << ". ";
cout << "Which is your favourite team? ";


cin.getline (mybuffer,100);


cout << "I like " << mybuffer << " too. ";
return 0;
}

What's your name? Juan
Hello Juan.
Which is your favourite team? Inter Milan
I like Inter Milan too.

在上面的例子中我们也可以用以下代码来读取用户输入:

cin >> mybuffer;

这种方法也可以工作,但它有以下局限性是cin.getline所没有的:

  • cin只能接收单独的词(而不能是完整的句子),因为这种方法以任何空白符为分隔符-表示输入结束,包括空格spaces,跳跃符tabulators,换行符newlines和回车符arriage returns。
  • cin不能给buffer指定容量,这使得程序不稳定,如果用户输入超出数组长度,输入信息会被丢失。

因此,建议在需要用cin来为数组输入字符串时,使用cin.getline来代替cin >>。