B2118 验证子串
B2118 验证子串
#include <iostream>
using namespace std;
# include <string.h>
#include <ctype.h>
#include <algorithm>
int main(){char str1[25],str2[25];// cin.getline(str1,25);// cin.getline(str2,25);cin>>str1>>str2;if(strstr(str1,str2)){//str1包含str2cout<<str2<<" is substring of "<<str1; }else if(strstr(str2,str1)){cout<<str1<<" is substring of "<<str2;}else{cout<<"No substring";}
}
在你的代码中,使用 `cin >> str1 >> str2` 和 `cin.getline(str1, 25); cin.getline(str2, 25);` 的行为有所不同,主要是因为它们对输入的处理方式不同:
1. **`cin >> str1` 和 `cin >> str2` 的行为**:
- `cin >> str1` 和 `cin >> str2` 会**读取非空白的连续字符**,并在遇到空白字符(如空格、换行符)时停止。
- 因此,如果输入的字符串不包含空格等空白字符(如 "hello"),`cin >> str1 >> str2` 可以正确读取两个单词并存储在 `str1` 和 `str2` 中。
2. **`cin.getline(str1, 25); cin.getline(str2, 25);` 的行为**:
- `cin.getline` 会读取整行内容,包括空格,直到遇到换行符或到达指定的最大字符数(这里是 `25`)。
- 当 `cin.getline` 读取字符串时,输入缓冲区的换行符可能会被视为新的行内容,导致第二次调用 `cin.getline` 时读取到一个空字符串(即直接读取了换行符)。
### 为什么 `cin.getline` 版本会出错?
当你使用 `cin >> str1`,然后注释掉 `cin.getline(str1, 25); cin.getline(str2, 25);` 时,输入的换行符不会被留在缓冲区,这样 `cin.getline` 可以顺利读取第二行输入。
但是如果只使用 `cin.getline`,第一次读取 `str1` 时会消耗掉当前行的所有字符,包括换行符,而第二次调用 `cin.getline(str2, 25);` 时会读取到剩下的换行符,导致 `str2` 读取为空字符串。要解决这个问题,可以在第一次 `getline` 之后清除换行符,或者使用 `cin.ignore()` 以跳过缓冲区中的换行符。
### 修正方法
在 `cin.getline` 读取 `str1` 之后,调用 `cin.ignore()`,这样可以确保第二次 `getline` 能够正确读取到新的输入。
```cpp
#include <iostream>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
int main() {
char str1[25], str2[25];
cin.getline(str1, 25);
cin.ignore(); // 清除缓冲区的换行符
cin.getline(str2, 25);
if (strstr(str1, str2)) { // str1包含str2
cout << str2 << " is substring of " << str1;
} else if (strstr(str2, str1)) {
cout << str1 << " is substring of " << str2;
} else {
cout << "No substring";
}
}
```
### 总结
- `cin >> str1 >> str2` 读取非空白字符,因此适用于输入中没有空格的情况。
- `cin.getline` 适用于读取整行内容,但需要注意缓冲区中的换行符问题,可以通过 `cin.ignore()` 来清除多余的换行符,以确保读取完整的下一行内容。
是的,基本上可以这么理解:
- **单行字符串读取**:如果只读取一行字符串,且该行内容没有空格,`cin >>` 和 `cin.getline` 都可以正常工作。
- **`cin >>`** 会读取单词(以空白字符作为分隔),忽略开头的空白字符,适合读取不带空格的单个单词或简单字符串。
- **`cin.getline`** 会读取整行内容(包括空格),直到遇到换行符。适合读取包含空格的整行字符串。
- **多行字符串读取**:如果需要读取多行字符串并且每行可能包含空格,**推荐使用 `cin.getline`**,但要注意换行符的问题。
- 在使用 `cin.getline` 读取多行字符串时,需要使用 `cin.ignore()` 来清除多余的换行符,确保每次 `getline` 调用都从新的一行开始。
- 如果用 `cin >>` 读取多行单词,每次输入只能读取到第一个空白字符前的内容,无法读取包含空格的整行。
### 总结
- **如果内容中包含空格且要读取整行**:使用 `cin.getline`。
- **如果内容是单个单词或连续的字符且没有空格**:`cin >>` 更简单,也更适合读取不包含空格的输入。
- **读取多行**:
- 使用 `cin.getline`,并确保在每行读取完后调用 `cin.ignore()` 清除缓冲区中的换行符。