目录
统计整数个数
【问题描述】输入一个字符串,其包括数字和非数字字符,如:a123x456 17935? 098tab,将其中连续的数字作为一个整数,依次存放到数组a中,统计共有多少个整数,并输出这些数。
【输入形式】数字和非数字字符的字符串
【输出形式】多行,第一行输出整数个数,后面每行输出一个整数
【样例输入】a123x456 17935? 098tab583
注意需要保留带有空格的字符串,请不要使用gets,cin,练习使用cin.getline(char *str, int maxnum)
【样例输出】
5
123
456
17935
98
583
【样例说明】第一个输出项为整数的个数,后面的分别为具体的整数。注意,不需要输出提示类文字,如:“整数为”,“分别为”等字样。直接输出结果。有一个数字的也要输出。测试用例中没有超过整数范围连续数字。当遇到0开头的数字应舍去0。
#include<iostream>
#include<cstring>
#include<cctype>
using namespace std;
void sum_Num(char* s) {
int i = 0;
int count = 0;
while (*(s + i)) {
if (isdigit(*(s + i))) {
if (!isdigit(*(s + i + 1))) {
count++;
}
}
i++;
}
cout << count << endl;
i = 0;
while (*(s + i)) {
if (isdigit(*(s + i))) {
cout << *(s + i);
if (!isdigit(*(s + i + 1))) {
cout << endl; }
}
i++;
}
}
int main() {
char str[50];
cin.getline(str, 50);
sum_Num(str);
return 0;
}
我们发现,当使用这个代码的时候,无法实现开头数字为0的时候将0舍去,于是我们对代码进行更改
#include<iostream>
#include<vector>
#include<cctype>
#include<cstring>
using namespace std;
int main() {
char s[50];
cin.getline(s, 50);
char* p;
p = s;
int num = 0;
int count = 0;
vector<int>number;
int i = 0;
while (*(p + i)) {
if (isdigit(*(p + i))) {
num = num * 10 + *(p + i) - '0';
if (!isdigit(*(p + i + 1))||*(p+i)=='\0') {
number.push_back(num);
num = 0;
count++;
}
}
i++;
}
cout << count << endl;
for (int i = 0; i < count; i++) {
cout << number[i] << endl;
}
return 0;
}
`<cctype>` 中常用的函数包括:
1. `isalpha(c)`: 检查字符 `c` 是否为字母。
2. `isdigit(c)`: 检查字符 `c` 是否为数字。
3. `isalnum(c)`: 检查字符 `c` 是否为字母或数字。
4. `isspace(c)`: 检查字符 `c` 是否为空白字符(如空格、制表符)。
5. `islower(c)`: 检查字符 `c` 是否为小写字母。
6. `isupper(c)`: 检查字符 `c` 是否为大写字母。
7. `tolower(c)`: 将字符 `c` 转换为小写(如果可能)。
8. `toupper(c)`: 将字符 `c` 转换为大写(如果可能)。
这些函数通常接受一个 `char` 类型的参数,并返回一个布尔值(对于判断函数)或另一个字符(对于转换函数)。
字符串排序
【问题描述】有5个字符串,首先将它们按照字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。
【输入形式】5个字符串,用回车分隔
【输出形式】输出一个字符串:按5个字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出,若少于三个字符的输出一个空格
【样例输入】
test1234
123test
cumt
think
apples
【样例输出】
cumt think apples 123test test1234
concatenate string:mip3s
【样例说明】输出的第一行中,每个字符串后面有一个空格。字符数量相等的串相对顺序不变。
按照题目要求,采用了字符串指针和指针数组来实现:
#include<iostream>
#include<cstring>
using namespace std;
int main() {
char strings[5][50];
char* p[5];
for (int i = 0; i < 5; i++){
cin.getline(strings[i], 50);
p[i] = strings[i];
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4-i; j++) {
if (strlen(p[j]) > strlen(p[j+1]))
{
char* temp;
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
}
for (int i = 0; i < 5; i++) {
cout << p[i]<<" ";
}
cout<<endl;
char concatenatedString[6];
for (int i = 0; i < 5; i++) {
if (strlen(p[i]) >= 3) {
concatenatedString[i] = p[i][2];
}
else concatenatedString[i] = ' ';
}
concatenatedString[5] = '\0';
cout << "concatenate string:" << concatenatedString<<endl;
return 0;
}
快速排序更加快捷高效,以下是一个快速排序实现的代码
#include <iostream>
#include<string>
using namespace std;
string str[5];
void quick_sort(int l,int r)
{
if(l>=r)return;
int x=str[l+r>>1].size();
int i=l-1,j=r+1;
while(i<j)
{
do i++;while(str[i].size()<x);
do j--;while(str[j].size()>x);
if(i<j)swap(str[i],str[j]);
}
quick_sort(l,j);
quick_sort(j+1,r);
}
int main()
{
for(int i=0;i<5;i++)cin>>str[i];
quick_sort(0,4);
for(int i=0;i<5;i++)cout<<str[i]<<" ";
char s[6];
for(int i=0;i<5;i++)
{
if(str[i].size()>=3)s[i]=str[i][2];
else s[i]=' ';
}
s[5]='\0';
cout<<endl<<"concatenate string:";
for(int i=0;i<5;i++)cout<<s[i];
return 0;
}
插入字符串
【问题描述】从键盘输入一个字符串,并在串中的第一次出现的最大元素后边插入字符串”ab”。
【输入形式】任意输入一个字符串
【输出形式】在串中的最大元素后边插入字符串”ab”
【样例输入】123csCUMT
【样例输出】123csabCUMT
【样例说明】为了保证输入的字符串有空格,请使用cin.getline(char* , int); 本系统不支持使用gets。只插入一次ab。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char str[100];
cin.getline(str,100);
int len=strlen(str);
char *p;
p=str;
char max=p[0];
int t=0;
for(int i=0;i<len;i++){
if(p[i]>max){
max=p[i];
t=i;
}
}
for(int i=len;i>t;i--){
*(p+i+2)=*(p+i);
}
len=len+2;
*(p+t+1)='a';
*(p+t+2)='b';
cout<<p;
return 0;
}