1.字符串插入(10分)
题目内容:
有两个字符串str和substr,str和substr的字符个数不超过10^5,只包含大小写字母和数字。(字符个数不包括字符串结尾处的’\0’。)将substr插入到str中ASCII码最大的那个字符后面,若有多个最大则只考虑第一个。
输入格式:
输入数据只有一行,格式为
str substr
输出格式:
输出插入之后的字符串。
输入样例:
abcab eee
输出样例:
abceeeab
时间限制:500ms内存限制:32000kb
C语言↓
#include<stdio.h>
#include<string.h>
int main(){
char str[100000], substr[100000]; //声明字符数组
int length, max;
length = max = 0;
scanf("%s%s", &str, &substr); //scanf()函数输入字符串,以空格间隔,回车结束
length = strlen(str); //用string库中的strlen()函数获取str字符串长度
//不包括'\0'
for(int i=0; i<length; i++){
if(str[i]>str[max]) //比较str字符串中各字符大小
max = i; //记录最大字符的下标
}
for(int i=0; i<=max; i++)
printf("%c", str[i]); //printf()输出str中最大字符及之前的字符串
printf("%s", substr); //其后输出要插入的substr字符串
for(int i=max+1; i<length; i++)
printf("%c", str[i]); //在substr字符串后继续输入str的后半部分
printf("\n");
return 0;
}
过程中遇到的问题:
- 不熟悉字符串的数据类型和定义,一开始在输入输出时傻傻地用了%c,翻看ppt才想起是%s;
- 不熟悉scanf()函数用法,试了半天不知道怎么实现“C语言在同一行输入两个字符串,以空格隔开,回车结束”
[外链图片转存失败(img-rPxO7xJw-1569428804389)(en-resource://database/2853:0)]
直到看见——
[外链图片转存失败(img-qCxhZwVZ-1569428804390)(en-resource://database/2855:0)]
scanf遇到空格就停止了……就停止了……停止了……止了……了……………………
What?!【黑人问号.gif】我脑子的内存是用光了吗???【头大.gif】
所以直接scanf输入就ok,会自动根据空格分成两个字符串。
- getchar()是在用户键入回车后,通过缓冲区一个字符一个字符地读取,返回int类型的ASCII码。相对应的有putchar();
getchar由宏实现:#define getchar() getc(stdin)。
getchar有一个int型的返回值。当程序调用getchar时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止。
当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符。
getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾则返回-1(EOF),且将用户输入的字符回显到屏幕。
如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。直到缓冲区中的字符读完后,才等待用户按键。
——from 百度百科
- gets()在用户键入回车后,从缓冲区读入一行字符(以’\n’或EOF结束),返回字符数组的指针。
- getch()则直接从键盘读取字符,不需键入回车,每输入一个字符都立即返回ASCII码。
- 用string.h库里的函数strlen()可以获取字符串长度,这是搜索到的。
P.S. strlen()和sizeof()的区别在于前者是函数,计数时不包括’\0’,且返回值是size_t类型(无符号整型);而后者是单目运算符,计数时包括结束字符,在编译时计算缓冲区长度,不能用来返回动态分配的内存空间的大小。
参考文章:C语言strlen与sizeof的区别详解
C++↓
#include<iostream>
#include<cstring>
int main(){
std::string str, substr;
while(std::cin>>str>>substr){
int n = str.length();
int max = 0;
for(int i=0; i<n; i++)
if(str[i]>str[max])
max = i;
for(int i=0; i<=max; i++)
std::cout << str[i];
std::cout<<substr;
for(int i=max+1; i<n; i++)
std::cout << str[i];
std::cout << std::endl;
}
return 0;
}
暂待解决的基础概念性问题:
- string类&类模板basic_string
- 输入输出流&cin、cin.get()等(输入方法总结)
- 标准命名空间std