strcpy(t[i],a[j],n);该语句的意思是:将某已知二维数组a的第j行前n个字符复制到另一个二维数组t的第i行中。给分吧
在抚远等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、网站设计、外贸营销网站建设 网站设计制作定制制作,公司网站建设,企业网站建设,成都品牌网站建设,成都营销网站建设,成都外贸网站制作,抚远网站建设费用合理。
在C语言当中,对于数组复制要分两种。
1)字符数组。
字符数组相当于字符串,可以用标准函数strcpy()和strncpy()直接进行字符串复制。
2)其他数组。
由于C语言的原始性,它并不具备操作符重载。所以对于数组复制,都需要对数组进行遍历,然后每个元素每个元素的一一复制。根据数组的大小和维数,可选择不同的循环或者递归进行复制。
有两种常用的方法。
1 对数组各个维循环,遍历每个元素,并将其赋值到目标数组的对应位置上。
缺点:代码相对复杂。
优点:可以不不同大小和形式的数组进行交叉复制。
2 利用C语言中多维数组元素存储连续性,使用memcpy函数整体复制。
缺点:仅使用源数组要复制的数据是连续的,同时在目标数组中以同样顺序连续复制的情况。
优点:代码简单,一个函数调用即可完成赋值。相对第一种,执行效率略高。
在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IListT.Copy,BinaryReader.ReadBytes,Buffer.BlockCopy,以及System.Buffer.memcpyimpl,由于最后一种需要使用指针,所以本文不引入该方法。
本次测试,使用以上前4种方法,各运行1000万次,观察结果。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace BenchmarkCopyArray
{
class Program
{
private const int TestTimes = 10000000;
static void Main()
{
var testArrayCopy = new TestArrayCopy();
TestCopy(testArrayCopy.TestBinaryReader, "Binary.ReadBytes");
TestCopy(testArrayCopy.TestConvertToList, "ConvertToList");
TestCopy(testArrayCopy.TestArrayDotCopy, "Array.Copy");
TestCopy(testArrayCopy.TestBlockCopy, "Buffer.BlockCopy");
Console.Read();
}
private static void TestCopy(Action testMethod, string methodName)
{
var stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i TestTimes; i++)
{
testMethod();
}
testMethod();
stopWatch.Stop();
Console.WriteLine("{0}: {1} seconds, {2}.", methodName, stopWatch.Elapsed.Seconds, stopWatch.Elapsed.Milliseconds);
}
}
class TestArrayCopy
{
private readonly byte[] _sourceBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
public void TestBinaryReader()
{
var binaryReader = new BinaryReader(new MemoryStream(_sourceBytes));
binaryReader.ReadBytes(_sourceBytes.Length);
}
public void TestConvertToList()
{
IListbyte bytesSourceList = new Listbyte(_sourceBytes);
var bytesNew = new byte[_sourceBytes.Length];
bytesSourceList.CopyTo(bytesNew, 0);
}
public void TestArrayDotCopy()
{
var bytesNew = new byte[_sourceBytes.Length];
Array.Copy(_sourceBytes, 0, bytesNew, 0, _sourceBytes.Length);
}
public void TestBlockCopy()
{
var bytesNew = new byte[_sourceBytes.Length];
Buffer.BlockCopy(_sourceBytes, 0, bytesNew, 0, _sourceBytes.Length);
}
}
}