第1题
描述
输入一个正整数n,然后输入n个字符串,最后输入一个正整数m(m<=n),要求输出第m个字符串
输入
一个正整数n,然后是n个字符串,最后是一个正整数m(m<=n)
输出
一个字符串,是输入的n个字符串中第m个字符串。不要换行。
样例输入
3
abc cd efg
2
样例输出
cd
思路
怎么说也是道签到题,但这道题有趣的并不是他的难易度,而是有关malloc
和new
两种不同动态分配方式的讨论
代码[C]
[Forlogin]
#include <stdio.h>
#include <string.h>
int main(){
int m,n;
scanf("%d",&m);
char *p[m];
for(int i=0;i<m;i++){
p[i]=(char*)malloc(100*sizeof(char));
scanf("%s",p[i]);
}scanf("%d",&n);
printf("%s",p[n-1]);
}[/Forlogin]
代码[C++]
[Forlogin]
#include <iostream>
#include <string.h>
using namespace std;
int main(){
int m,n;
cin>>m;
char *p[m];
for(int i=0;i<m;i++){
p[i]=new char [10];
cin>>p[i];
}cin>>n;
cout<<p[n-1];
}[/Forlogin]
有关malloc和new的区别
对于一个长期使用C语言的老鸟而言,malloc的熟练程度一定要比new要来的高
但是他们俩有什么区别呢?
首先来说一下他们的定义分别是什么
malloc
malloc的作用是分配所需的内存空间,并返回一个指向它的指针,是C语言stdlib.h库的一个库函数,下面是malloc的声明
void *malloc(size_t size)
malloc的返回值是指向已分配大小的内存的指针或null,且在未作特别规定的情况下指针类型位void
下面是malloc的用法实例(源自菜鸟教程)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *str;
/* 最初的内存分配 */
str = (char *) malloc(15);
strcpy(str, "runoob");
printf("String = %s, Address = %u\n", str, str);
/* 重新分配内存 */
str = (char *) realloc(str, 25);
strcat(str, ".com");
printf("String = %s, Address = %u\n", str, str);
free(str);
return(0);
}
以上运行结果的返回值是
String = runoob, Address = 3662685808
String = runoob.com, Address = 3662685808
new
new是C++的一种特殊运算符,而非库函数。下面是使用 new 运算符来为任意的数据类型动态分配内存的通用语法
new data-type;
这里着重讲解一下new的数组空间分配方法
一维数组
// 动态分配,数组长度为 m
int *array=new int [m];
//释放内存
delete [] array;
二维数组
int **array
// 假定数组第一维长度为 m, 第二维长度为 n
// 动态分配空间
array = new int *[m];
for( int i=0; i<m; i++ )
{
array[i] = new int [n] ;
}
//释放
for( int i=0; i<m; i++ )
{
delete [] array[i];
}
delete [] array;
不同点
malloc与new不同的地方不仅在于他们的类型是函数还是运算符,更在于他们的分配方式与返回值。
分配方式不同
malloc的特点在于能够人为的为一个值分配在内存允许范围大小的空间,优点是直观、可改动性强
new的特点更像是“用多少拿多少”,能够根据数据变动自动从堆内分配内存,优点是简便
返回值不同
malloc返回的是指针,能够直接赋值给一个与其类型相同的左值
new返回所分配空间的地址(也有部分教材和文章认为返回的是指针),这点与malloc类型;同时new还能返回包括类或结构在内的自定义的任何数据类型,而这一功能是malloc没有的