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++ 中,cin
和 getline
都可以用于读取字符串,但它们的行为 有很大区别。
方法 | 读取内容 | 读取到空格/换行时 | 读取方式 |
---|
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. cin
和 getline
混用的问题
当 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
不能处理带空格的输入!