字符串输入和可能产生的问题

    科技2022-08-05  115

    一.字符串长度测量

    sizeof运算符指出整个数组的长度; strlen()只计算可见的字符,而不把空字符计算在内。

    二.字符串输入

    #include <iostream> int main() { using namespace std; const int ArSize = 20; char name[ArSize]; char dessert[ArSize]; cout << "Enter your name:\n"; cin >> name; cout << "Enter your favorite dessert:\n"; cin >> dessert; cout << "I have some delicious " << dessert; cout << " for you, " << name << ".\n"; // cin.get(); // cin.get(); return 0; }

    你会发现,用户根本没有机会输入dessert。 cin如何确定字符串完成的呢? cin使用空白(换行符)来确定字符串的结束,这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。读取第二个字符串时,自动忽略之前的空格。

    三.读取一行字符串输入

    有时,我们需要输入的内容由多个单词构成,这时cin就不够用了。 我们可以使用

    1.cin.getline(name,number);

    通过回车键的换行符来确定输入结尾。 cin.getline()读取 “输入的内容”+用户按enter键而生成的换行符,并将换行符替换为’\0’存储在数组之中。(cin则不会读取空格和换行符) 但使用时要小心。 混合输入数字和字符串产生的问题:

    #include <iostream> using namespace std; int main() { int name1; char name2[8]; cin>>name1; cin.getline(name2,8); cout<<name1<<endl; cout<<name2; }

    你会发现,用户根本没有机会输入name2。 解决办法: 在 cin>>name1;后插入cin.get();

    2.cin.get();

    cin.get(name,number)

    方法与cin.getline()类似,一样一次读取一行,但是第一个cin.get()不会读取换行符,将它留在输入队列中。 因此第二次调用时,看到的第一个字符就会是换行符。 解决方案:后面一个get()用于读取换行符; 采用变体的方法:cin.get(name,number).get();

    四.String类

    在C++头部添加#include<string>,运算时添加#include<cstring>. strcpy(); 复制 strcat(); 附加 strcmp(); 比较字符串是否相等,不等为1,相等为0.

    1.string类i/o

    getline(cin,name);

    读取输入给string对象。

    五.指针和字符

    char flower[10]="rose"; cout<<flower<<" s are red\n";

    数组名是第一个元素的地址,cout打印该地址处的字符,然后继续打印后面的字符。 C++中,char数组名,char指针以及用引号括起的字符串都被解释为字符串第一个字符的地址。

    1.char指针数组

    一般来说,如果给cout提供一个指针,它将打印地址。但如果指针类型为char*,则cout将显示指向的字符串。

    const int a=3; char *p[a]={ "aoe fds", "cat fd", "dodf sfg" };

    每个元素都是一个char指针,可被初始化为一个字符串的地址。 p[0]指向aoe fds,p[1]指向cat fd… 输出:

    for(int i=0;i<a;i++){ cout<<p[i]<endl; }

    或者

    char p[3][10]={ "aoe fds", "cat fd", "dodf sfg" };
    Processed: 0.016, SQL: 8