当前位置: 首页 > news >正文

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()` 清除缓冲区中的换行符。


http://www.mrgr.cn/news/66511.html

相关文章:

  • 【Android】初识路由框架及ARouter基本使用方法
  • 2024年专业的10款数据恢复工具你都用过哪些?
  • python类方法、实例方法以及相互关系
  • MybatisPlus入门(八)MybatisPlus-DQL编程控制
  • ESP-HaloPanel:用 ESP32-C2 打造超低成本智能家居面板
  • 软设师知识点-计算机网络
  • Swift 开发教程系列 - 第5章:集合类型
  • oracle数据检查方法
  • 多client向同一个pushgateway推送指标被覆盖问题
  • 解密抖音推荐算法:个性化内容背后的技术奥秘
  • 【MongoDB】MongoDB的聚合(Aggregate、Map Reduce)与管道(Pipline) 及索引详解(附详细案例)
  • 一篇文章速通Java开发Stream流(流水线开发附斗地主小游戏综合案例)
  • 一文快速预览经典深度学习模型(一)——CNN、RNN、LSTM、Transformer、ViT
  • Vue:计算属性
  • JavaScript 变量作用域与函数调用机制:var 示例详解
  • SEO
  • 一个最简单的网络编程
  • OpenID Connect 和 OAuth 2.0 有什么不同?
  • Java继承练习
  • C++《list的模拟实现》
  • 通讯录(静态)
  • js基础篇笔记 (万字速通)
  • 【安装配置教程】二、VMware安装并配置ubuntu22.04
  • Kane-Mele X4Y2Z6材料自旋电子和谷电子理论研究
  • CSS的配色
  • 【数据分享】1981-2024年我国逐日平均气温栅格数据(免费获取)