1. 题目解析与解题思路
这道PTA天梯赛的Left-pad题目看似简单,但涉及了几个C++字符串处理的关键知识点。我们先来看题目要求:
题目要求我们实现一个类似Linux系统中left-pad命令的功能:给定一个字符串s、一个字符c和一个数字n,当字符串长度小于n时,在左侧用字符c填充至长度n;当字符串长度大于等于n时,只保留字符串最右侧的n个字符。
1.1 输入处理的关键点
在实际编码中,第一个遇到的难题就是输入处理。很多初学者会直接这样写:
cpp复制cin >> n >> c;
getline(cin, s);
结果发现s总是空字符串。这是因为cin >> n >> c读取完数字和字符后,输入缓冲区中会残留一个换行符\n,而getline()会立即读取到这个换行符,导致s为空。
解决方案是使用cin.ignore()清除缓冲区中的换行符:
cpp复制cin >> n >> c;
cin.ignore(); // 清除缓冲区中的换行符
getline(cin, s);
注意:
cin.ignore()默认只忽略缓冲区中的第一个字符。如果需要忽略多个字符,可以指定参数,如cin.ignore(100, '\n')表示忽略最多100个字符,直到遇到换行符为止。
1.2 字符串处理的两种情形
根据题目要求,我们需要处理两种情况:
- 字符串长度不足n:需要在左侧用字符c填充,直到总长度达到n
- 字符串长度足够:只需要截取字符串最右侧的n个字符
对于第二种情况,C++的substr()函数可以完美解决:
cpp复制s.substr(start_idx, n)
其中start_idx = s.size() - n,表示从哪个位置开始截取。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 完整代码实现与解析
下面我们来看完整的AC代码,并逐段解析:
cpp复制#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
char c;
string s;
// 1. 读取数字和字符
cin
