C++随记,字符串与指针,指针与数组,cin与换行符

1. C++ 中声明字符串的方法

    std::string str1 = "Hello, World!";  // C++ 字符串
    char str2[] = "Hello, World!";       // C 风格字符串(字符数组)

    char *p =&str1[0]; //获取指向字符串的指针
    char *q=&str2;     //获取指针(C风格)

2. p和*p打印的内容

    int num = 42;
    int* p = #  // p 存储 num 的地址
    cout << p << endl;  // 输出 p,即地址
    cout << *p << endl;  // 输出42

    //如果 p 是 char*,它会被解释为 C 风格字符串(以 \0 结尾的字符串)
    char str[] = "Hello";
    char* p = str;
    cout << p << endl;  // 输出字符串 "Hello",而不是地址
    cout << *p << endl;  // 输出H

3. cin和getline的区别

在 C++ 中,cingetline 都可以用于读取字符串,但它们的行为 有很大区别

方法读取内容读取到空格/换行时读取方式
cin >> str单词(字符串的一部分)停止读取(默认以空格、换行、制表符分隔)读取到空格或换行前的内容
getline(cin, str)一整行读取完整行(包含空格),遇到 换行符 \n 停止读取整行,包括空格

1.cin的问题

  • 遇到空格会停止读取
    • 例如输入 "Hello World"cin >> str; 只会读取 "Hello""World" 被丢弃。
  • 可能导致缓冲区遗留换行符
    • 如果在 cin 读取字符串之前有 cin >> int; 这样的输入操作,缓冲区可能遗留 \n,影响后续输入

2.getline的正确用法

    char str[100];  // 定义一个100长度的字符数组
    cin.getline(str, 100);  // 读取最多 99 个字符,遇到 '\n' 停止

行为

  • getline(cin, str, '\n') 读取 一整行,包括空格,遇到 \n(默认的分隔符)才停止。
  • 如果输入 "Hello World",则完整存入 str,而不会被空格截断。
  • getline 会自动在 读取的字符串末尾添加 \0 作为 C 风格字符串的终止符。

4. cingetline 混用的问题

cin 读取数值后,直接使用 getline() 读取字符串可能会 跳过输入,因为 cin 读取数值后,缓冲区会遗留一个 \n

    int age;
    char name[50];
    cout << "请输入年龄: ";
    cin >> age;  // 这里只读取数值,但回车键 `\n` 还在缓冲区
    cout << "请输入名字: ";
    cin.getline(name, 50);  // 可能直接跳过
  • cin >> age; 读取 25,但缓冲区里仍然留着 \n
  • getline(name, 50) 直接读取 \n,导致 name 变成空字符串

    解决方法

    清除缓冲区 \n cin.ignore()

最佳实践

  • 读取单词(不含空格):cin >> str;
  • 读取整行(含空格):cin.getline(str, size);
  • 先输入数值再读取字符串cin >> int; cin.ignore(); cin.getline(str, size);

🚀 结论:读取字符串一般推荐用 getline,因为 cin 不能处理带空格的输入!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值