C-风格字符串
发布日期:2021-05-07 00:55:19 浏览次数:27 分类:精选文章

本文共 3505 字,大约阅读时间需要 11 分钟。

C-风格字符串

字符串是存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种:一种是来自C语言的C-风格字符串,另一种是基于string类库的方法。本文将介绍C-风格字符串。

C-风格字符串的特点

C-风格字符串的特点在于:

  • 字符串以空字符(ASCII码为0)结尾。
  • 空字符用于标记字符串的结尾。
  • 空字符不占实际存储空间,但会影响字符串长度。
  • 示例

    char dog[8] = {'b','e','a','u','x',' ','I','I'};  //不是字符串
    char cat[8] = {'f','a','t','e','s','s','a','\0'}; //是字符串
    • dog数组不是字符串,因为没有空字符结尾。
    • cat数组是字符串,因为最后有空字符。

    C++有许多处理字符串的函数,包括cout使用的那些函数,它们都会逐个处理字符串中的字符,直到遇到空字符为止。

    初始化字符串常量

    初始化字符数组为字符串的方法有两种:

  • 使用单引号括起的字符串:char cat[8] = "fattss a\0";

    • 需要手动添加空字符。
    • 存在风险,容易遗漏空字符。
  • 使用双引号括起的字符串:char cat[8] = "fattss a";

    • 结尾自动包含空字符。
    • 编译器会自动计算数组的大小。
  • 示例

    char bird[11] = "Mr. Cheeps";  // 结尾自动包含\0
    char fish[] = "Bubbles"; // 编译器自动计算数组大小
    • 使用双引号的字符串隐式包含空字符,编译器会自动截断字符串到空字符处。
    • 确保数组大小足够容纳字符串,包括空字符。

    字符串拼接

    C++允许使用双引号括起的字符串拼接。两个由空白(空格、tab和换行符)分隔的字符串常量会自动拼接为一个字符串。

    示例

    cout << "I'd give my right arm to be" " a great violinist.\n";
    // 等效于
    cout << "I'd give my right arm to be a great violinist.\n";

    注意事项

    • 拼接时不会在被连接的字符串之间添加空格。
    • 第二个字符串的第一个字符会紧跟在第一个字符串的最后一个字符(不考虑空字符)后面。
    • 第一个字符串中的空字符会被第二个字符串的第一个字符取代。

    在数组中使用字符串

    示例程序

    #include 
    #include
    int main() {
    using namespace std;
    const int Size = 15;
    char name1[Size]; // 空数组
    char name2[Size] = "C++owboy"; // 初始化数组
    cout << "Howdy! I'm " << name2 << "! What's your name?\n";
    cin >> name1;
    cout << "Well, " << name1 << ", your name has " << strlen(name1) << " letters and is stored\n";
    cout << "in an array of " << sizeof(name1) << " bytes.\n";
    cout << "Your initial is " << name1[0] << ".\n";
    name2[3] = '\0'; // 设置空字符
    cout << "Here are the first 3 characters of my name: ";
    cout << name2 << endl;
    cin.get();
    cin.get();
    return 0;
    }

    输出结果

    • sizeof() 返回数组的总字节数:15字节。
    • strlen() 返回字符串的长度,不包括空字符。
    • name2[3] = '\0' 将字符串从第三个字符开始截止。

    字符串输入

    示例程序

    #include 
    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 << " for you, " << name << ".\n";
    cin.get();
    cin.get();
    return 0;
    }

    输入结果

    • cin读取字符串时,使用空白字符(空格、tab和换行符)来确定字符串的结束位置。
    • cin会自动在字符串结尾添加空字符。

    解决方法

    在读取字符串之前,先丢弃换行符:

    cin >> year; cin.get();  // 或者 cin.get(ch);

    每次读取一行字符串输入

    使用 getline()

    cout << "Enter your name:\n";
    cin.getline(name, ArSize);
    • getline() 读取指定数目的字符或遇到换行符。
    • 如果字符串超过指定长度,余下的字符会被丢弃。

    使用 get()

    cout << "Enter your name:\n";
    cin.get(name, ArSize).get();
    • get() 读取字符,直到遇到换行符或达到指定长度。
    • 换行符会被保留在输入队列中。

    示例程序

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

    混合输入字符串和数字

    示例程序

    #include 
    int main() {
    using namespace std;
    cout << "What year was your house built?\n";
    int year;
    cin >> year;
    cout << "What is its street address?\n";
    char address[80];
    cin.getline(address, 80);
    cout << "Year built: " << year << endl;
    cout << "Address: " << address << endl;
    cout << "Done!\n";
    cin.get();
    cin.get();
    return 0;
    }

    问题

    • 当读取年份时,回车键生成的换行符会被留在输入队列中。
    • 后续读取字符串时会读取换行符,导致字符串为空。

    解决方法

    在读取年份后,先丢弃换行符:

    cin >> year; cin.get();

    总结

    C-风格字符串是C++中最基础的字符串处理方式,以空字符为结尾。使用双引号括起的字符串常量更为方便,隐式包含空字符。正确处理字符串拼接、数组存储和输入,能够有效避免常见错误。

    上一篇:【论文泛读45】更加物有所值:乐于助人的自然问题解答
    下一篇:【论文泛读44】BoolQ:探索自然是/否问题的惊人难度

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年03月24日 14时18分06秒