这些函数的区别在于 实现功能 以及 操作对象 不同。
strcpy 函数操作的对象是 字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能。
snprintf 函数操作的对象 不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。
这个函数主要用来实现 (字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定 %s 格式符,也
可实现字符串拷贝功能。 memcpy 函数顾名思义就是 内存拷贝,实现 将一个 内存块 的内容复制到另一个 内存块 这一功能。内存块由其首地址以及长度确定。
程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy 的操作
对象不局限于某一类数据类型,或者说可 适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。
鉴于 memcpy 函数等长拷贝的特点以及数据类型代表的物理意义,memcpy 函数通常限于同种类型数据或对象之间的拷贝,
其中当然也包括字符串拷贝以及基本数据类型的拷贝。 对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同:
? strcpy 无疑是最合适的选择:效率高且调用方便。
? snprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。
? memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话
? (最优长度是源字符串长度 + 1),还会带来性能的下降。其实 strcpy 函数一般是在内部调用 memcpy 函数或者
? 用汇编直接实现的,以达到高效的目的。因此,使用 memcpy 和 strcpy 拷贝字符串在性能上应该没有什么大的差别。
对于非字符串类型的数据的复制来说,strcpy 和 snprintf 一般就无能为力了,可是对 memcpy 却没有什么影响。但是,
对于基本数据类型来说,尽管可以用 memcpy 进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,
所以这种情况下memcpy几乎不被使用。memcpy的长处是用来实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。 21. 输出和为一个给定整数的所有组合。例如n=5,5=1+4;5=2+3(相加的数不能重复)则
输出1,4;2,3。
#include
int main(void)
{ }
unsigned long int i,j,k;
printf(\scanf(\if( i % 2 == 0) j = i / 2; else j = i / 2 + 1; printf(\for(k = 0; k < j; k++) printf(\return 0;
22. 读文件file1.txt的内容(例如):
12 34 56
输出到file2.txt: 56 34 12
(逆序)
#include
void test(FILE *fread, FILE *fwrite) {
char buf[1024] = {0};
if (!fgets(buf, sizeof(buf), fread)) return; test( fread, fwrite ); fputs(buf, fwrite); }
int main(int argc, char *argv[]) {
FILE *fr = NULL; FILE *fw = NULL;
fr = fopen(\ if(NULL == fr) { perror(\
exit(-1); }
fw = fopen(\ if(NULL == fw) { perror(\ exit(-2); }
test(fr, fw); fclose(fr); fclose(fw); return 0; }
23. 有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续
进行,求最后一个被删掉的数的原始下标位置。以7个数为例:{0,1,2,3,4,5,6,7} 0-->1-->2(删除)-->3-->4-->5(删除)-->6-->7-->0(删除),如此循环直到最后一个数被删除。
24. 写一个函数,将其中的'\\t'都转换成4个空格。
int change(char* pstr) { if(NULL == pstr) { return -1; } while(*pstr++ != '\\0') { if (*pstr == '\\t') { } } return 0; }
25. 编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”
如果n=2,移位后应该是“hiabcdefgh”。函数头是这样的: //pStr是指向以'\\0'结尾的字符串的指针 //steps是要求移动的n
void LoopMove ( char * pStr, int steps ) {
//请填充...
}
void LoopMove ( char *pStr, int steps ) {
int n = strlen( pStr ) - steps; char tmp[MAX_LEN]; strcpy ( tmp, pStr + n ); strcpy ( tmp + steps, pStr); *( tmp + strlen ( pStr ) ) = '\\0'; strcpy( pStr, tmp ); }
26. 判断两个数组中是否存在相同的数字,给定两个排好序的数组,怎样高效得判断这两个
数组中存在相同的数字?
bool findcommon2(int a[], int size1, int b[], int size2) {
int i=0,j=0;
while(i return false; } 27. 按单词反转字符串并不是简单的字符串反转,而是按给定字符串里的单词将字符串倒转 过来,就是说字符串里面的单词还是保持原来的顺序,这里的每个单词用空格分开。例如:Here is www.fishksy.com.cn经过反转后变为:www.fishksy.com.cn is Here char* reverse_word(const char* str) { int len = strlen(str); char* restr = new char[len+1]; strcpy(restr,str); int i,j; for(i=0,j=len-1;i int k=0; while(k { i=j=k; while(restr[j]!=' ' && restr[j]!='' ){ j++; } k=j+1; j--; for(;i return restr; } 28. 求一个整形中1的位数。 ①int NumberOf1_Solution1(int i) { int count = 0; while(i) { if(i & 1) count ++; i = i >> 1; } return count; } ②int NumberOf1_Solution2(int i) { int count = 0; unsigned int flag = 1; while(flag) { if(i & flag) count ++; flag = flag << 1; } return count; } 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C语言笔试题答案(7)在线全文阅读。
相关推荐: