描述
有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
输入
数字n一行字符串数字m
输出
从m开始的子串
输入样例 1
13 ABcd12##**fg 5
输出样例 1
12##**fg
输入样例 2
6 abcdef 3
输出样例 2
cdef
代码一(如下):
#include <iostream>
#include <string>
using namespace std;
int main()
{
char a[100];
int n,m;
cin >> n >> a >> m;
char b[100];
for (int i = 0; i <=n-m; i++)
{
b[i] = a[i + m-1 ];
}
for (int i = 0; i <= n-m; i++)
{
cout << b[i];
}
return 0;
}
代码二(如下):
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a;
int n,m;
cin >> n >> a >> m;
for (int i = m-1; i <n ; i++)
{
cout << a[i];
}
return 0;
}
按理说采用如上代码是可以编译出正确答案,但是总感觉怪怪的,既然采用了string类型,那有什么必要输入n呢?直接采用a.size()岂不美哉?而且并没有执行题目中的复制成为另一个字符串这一过程而是直接输出了结果。
代码三(如下):substr函数
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a, b;
int n, m;
cin >> n >> a >> m;
b = a.substr(m-1);
cout << b;
return 0;
}
这里虽然相较于代码二而言执行了题目中的复制成为另一个字符串这一过程,但是n还是相当于摆设一样,没有用上。
问题点:
①:可以用字符串常量来初始化字符数组。如:char str[ ]={"I am happy"};
也可以省略花括号,直接写成char str[ ]="I am happy";
不是用单个字符作为初值,而是用一个字符串作为初值。(数组str的长度不是10,而是11(因为字符串常量的最后由系统加上一个‘\0’))。
字符数组并不要求它的最后一个字符必须为‘\0’,甚至可以不包含‘\0’。如
char str[6]={'C','h','i','n','a'}; 这样写也是完全合法的。
②:字符数组的输入输出可以有两种方法:1)逐个字符输入输出;2)将整个字符串一次输入或输出。例如:char str[20];cin>>str;cout<<str;
输出字符串时,cout流中用字符数组名,并不是用数组元素名。如
cout<<str; //用字符数组名,输出一个字符串
cout<<str[4]; //用数组元素名,输出一个字符
③:如果数组长度大于字符串实际长度,输出遇‘\0’结束。
④:substr函数:substr函数格式 (俗称:字符截取函数)
格式1: substr(string string, int a, int b);
格式2:substr(string string, int a) ;
格式1:
1、string 需要截取的字符串
2、a 截取字符串的开始位置
3、b 要截取的字符串的长度格式2:
1、string 需要截取的字符串
2、a 可以理解为从第a个字符开始截取后面所有的字符串。
该部分选自CSDN博文substr函数的使用_substr用法_大头博客的博客-CSDN博客