C
canvass
Practice makes perfect
展开
-
几个关于GetMemory的经典问题
TEST1void GetMemory1(char *p){ p = (char *)malloc(100);}void Test1(void) { char *str = NULL; GetMemory1(str); strcpy(str, "hello world"); printf(str);}调用GetMemory( str )后,str并未产生变化,依然是NULL。改变的只是str的一个拷贝的内存的变化 。 strcpy(...原创 2020-08-08 20:16:49 · 368 阅读 · 0 评论 -
C语言模拟实现strstr函数
形式:char * strstr ( const char * str1, const char * str2 );strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。 例如:str1[20]="abcdefg",str2[10]="bcd"。通过使用strstr函数可以得到”bcdefg“,输出的是你需要查找的字符串的位置。思路start——>str1, substart——>原创 2020-08-07 17:56:32 · 318 阅读 · 0 评论 -
C语言模拟实现memmove函数
memmove 是一个内存操作函数,不是字符串操作函数,它可以处理多种类型的数据。 void *memmove(void*dest,const void*src, size_t count );NOTE:它的返回值是void*,参数类型也是void*,这样它才可以处理不同类型的数据。 目标dest不能加const,源src加const。原因是我们需要从源src中拷贝数据到dest中,需要对dest进行赋值。若用const保护dest,便不能完成赋值操作。 memmove的好处是可以处理d...原创 2020-08-07 16:15:23 · 323 阅读 · 0 评论 -
D15.3 一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个只出现一次的数字,编程实现。
#include<stdio.h>#include<stdlib.h>void findnum(int *src,int n, int *pnum1, int *pnum2){ int i; int sum = 0; for (i = 0; i < n; i++) { sum ^= src[i]; } int pos; for (pos =...原创 2019-05-17 11:08:05 · 80 阅读 · 0 评论 -
Summer 8
1. 若有定义 typedef char STRING[255]; STRING s; 则 s 是 字符数组变量例如,你不用像下面这样重复定义有 81 个字符元素的数组:char line[81];char text[81];只需这样定义,Line类型即代表了具有81个元素的字符数组,使用方法如下:typedef char Line[81];Line text,l...原创 2019-07-29 09:56:52 · 174 阅读 · 0 评论 -
Summer 2
1.C语言中,函数返回值类型的定义可以缺省,此时函数返回值的隐含类型是 int。2.在VS2013下,这个结构体所占的空间大小是12字节。typedef struct{ int a; char b; short c; short d;}AA_t;一般编译器为 12 个字节。因为 一般编译器 定义 int 为 4 字节,short 为 2字节, char 为 1字节,而且要...原创 2019-07-25 14:52:18 · 107 阅读 · 0 评论 -
Summer 12
1.在C++语言中,下面关于数组的描述错误的是 CA.数组的名字就是指向该数组第一个元素的指针B.长度为n的数组,下标的范围是0-n-1C.数组的大小必须在编译时确定D.数组可通过值参数、地址指针、引用参数三种方式传递给函数数组的大小也可以在运行时确定大小,即动态开辟空间。2.若有int a[]={0,1,2,3,4,5,6,7,8,9,0},*p=a,i; 则引用错误的...原创 2019-08-02 18:58:27 · 289 阅读 · 0 评论 -
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。例如数组为{1,3,5,7,1,3,5,9},找出7和9。
运用异或运算符的解法 一个数组里面只有一个数字出现一次,其他都出现两次,请找出这个数字。 这个问题可以可以使用用异或的性质解决。异或的性质:对于整数a,有 (1) a^a=0 (2)a^0=a (2)a^b^...原创 2019-08-02 19:28:02 · 165 阅读 · 0 评论 -
Summer 4
写出以下程序的运行结果#include<stdio.h>#include<stdlib.h>#define F(X,Y) ((X)+(Y))//1#if 0int main(){ char a[20]; char *p1 = (char *)a; char *p2 = (char *)(a + 5); int n = p2 - p1; prin...原创 2019-07-25 16:15:02 · 109 阅读 · 0 评论 -
C语言中static关键字用法
static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。变量1. 局部变量普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。普通局部变量存储于进程栈空间,使用完毕会立即释放。静态局部变量使用s...原创 2019-07-25 18:11:11 · 138 阅读 · 0 评论 -
Summer 13
1.如下代码输出结果是 16#define sum(a,b,c) a+b+cint main(){ int i= 3; int j = 2; printf("%d\n", i*sum(i,(i+j),j)); //i*i+(i+j)+j=16 system("pause"); return 0;}2.下面程序运行结果是 7int f(int n){ stat...原创 2019-08-03 10:21:44 · 176 阅读 · 3 评论 -
Summer 1
1.下面程序的运行结果// 1.int main(){ int a[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24 }; int *q[4]; int k; for (k = 0; k < 4; k++) { q[k] = &a[k * 3]; } printf("%d\n", q[3][1]); sy...原创 2019-07-13 19:33:22 · 138 阅读 · 0 评论 -
D28 1000瓶药中找出一瓶毒药,10只老鼠做试验
题目:现有1000瓶药,其中有一瓶毒药,喝了之后1小时后才产生效果,现在你有10只老鼠和1个小时的时间,请问怎么找出毒药?解题: 这道题明显就是只能一开始就把所有药都喂给10只老鼠,1小时后就直接一次性出结果。现在以2只老鼠做例子,每只老鼠喝一瓶药,2只老鼠能验出2瓶,最多只能从3瓶中找出一瓶毒药;这显然不够的,但是如果是用第一只老鼠喝第一瓶药,第二只老鼠喝第二瓶药,第1和第2只老鼠喝...原创 2019-07-12 21:49:36 · 4535 阅读 · 0 评论 -
D15.4 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水, 给20元,可以多少汽水。 编程实现。
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int main(){ int cover; int sum; int n; scanf("%d%d", &cover, &n); sum = cover; while (cover >= n)...原创 2019-05-17 11:16:58 · 102 阅读 · 0 评论 -
D17. 指针(2)
5.//int main()//{// int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9, 8 };// int *p = &a[0][0];// int i, j;// //for (i = 0; i < 3 * 4; ++i)//看二维数组不方便// // printf("%d", *(p+i));// for (i...原创 2019-05-22 17:18:25 · 95 阅读 · 0 评论 -
D19. 通讯录
#ifndef _MAILLIST_H#define _MAILLIST_Henum{ ADD_MSG = 1, DELETE_MSG, SEARCH_MSG, CHANGE_MSG, DISPLAY_MSG, EMPTY_MSG};struct MailList{ char name[50]; char gender; char telnum[30]; char...原创 2019-05-30 18:19:12 · 126 阅读 · 0 评论 -
D19.2 两种交换方式
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>//1.指针变指向交换//int main()//{// int *p1, *p2, p, a, b;// printf("please enter two integer numbers:");// scanf("%d%...原创 2019-05-30 22:39:11 · 87 阅读 · 0 评论 -
D20. 动态开辟
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>//int main()//{// char *p = (char *)malloc(sizeof(char)* 10);// strcpy(p, "123456");// printf(p);// //puts(p);/...原创 2019-06-02 23:00:45 · 135 阅读 · 0 评论 -
D21. 动态内存管理
//动态内存管理#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>//<malloc.h>//1.malloc 和 free//void* malloc(size_t size);//malloc 向内存申请一块连续可用的空间,并返回指向这块空间的指针//A.如果...原创 2019-06-04 22:48:39 · 117 阅读 · 0 评论 -
D23. 文件操作
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>//1.向文件读写字符//fgetc(fp); 从fp指向的文件读入一个字符,成功带回所读字符串,失败返回EOF(即-1)//fputc(ch,fp); 把字符ch写到文件指针变量fp所指向的文件中,成功返回值是输出的字符,失败返...原创 2019-06-16 22:42:45 · 151 阅读 · 0 评论 -
D22. 结构体内存对齐
#include<stdio.h>#include<stdlib.h>// 结构的自引用//struct Node//{// int data;// struct Node* next;//};////typedef struct Node//{// int data;// struct Node* next;//}Node;//结构体内存...原创 2019-06-11 22:57:56 · 346 阅读 · 0 评论 -
输入两个字符串,从第一个字符串中删除第二个字符串中所有的字符。
例如,输入“ They are students.” 和 “aeiou”, 则删除之后的第一个字符串变为“Thy r stdnts.”思路:通过遍历,我们依次判定第一个字符串中是否存在第二个字符串中的第i个字符,如果存在,则删除该字符,因此该方法就删除而言的时间复杂度为O(n^2)。显然,整个算法的时间复杂度还是较大的。空间兑换时间的方法:对于字符串,由于ASCII码的所有符号...原创 2019-08-03 16:39:49 · 6382 阅读 · 0 评论 -
Summer 14
1.如果二进制文件a.dat 已经存在,现在要求写人全新数据,应以 B 方式打开。A. "w"B. "wb "C. "w+"D. "wb+"首先是dat(二进制)文件,必须带b。全新文件,不能有+号,故选B.2.直接使文件指针重新定位到文件读写的首地址的函数是rewind ()ftell() 函数用于得到文件指针当前位置相对于文件首地址的偏移字节数;f...原创 2019-08-03 18:36:23 · 1917 阅读 · 0 评论 -
编写一个函数,求一个数字是否是回文数。
回文数概念:给定一个数,这个数顺读和逆读都是一样的。例如:121,1221是回文数,123,1231不是回文数。核心思想:将整数逆序后形成另一整数,判断两个整数是否相等来实现的。由"水仙花"数出发,进而考虑回文数(例如,121,1234321...),得到遍历一个数的每一位的方法.for(i=a ; i<=b ; i++) 其中 i 在循环中完成了[a,b]的遍历;for(i...原创 2019-08-03 19:51:55 · 6098 阅读 · 1 评论 -
编写代码完成如下功能:删除字符串首尾的空格,中间的连续空格只留一个,原来字符串的顺序不变。
如“*****as****adadq*****”(*是空格)变成“as*adadq"./*字符串去除多余的空格,一个或多个连续的空格变成一个空格(声明一个新的数组存储)*/#include<stdio.h>#include<string.h>char *deblank(char string[]){ int i, j = 0; char *str = ...原创 2019-08-06 13:56:42 · 669 阅读 · 2 评论 -
Summer 20
1.int main(){ char str[] = { 'g', 'o', 'o', 'd' }; char str1[8] = { 'g', 'o', 'o', 'd', '!' }; char str2[8] = "good!"; //char *str3 = "good!"; printf("%d\n", sizeof(str));//4 printf("%s\n", ...原创 2019-08-06 13:53:15 · 158 阅读 · 6 评论 -
字符串压缩.输入字符串只包含a-z字母以及结束标志,请编写函数实现对连续出现的相同字符进行压缩。
例如:“xxxyyyyz”压缩字符串为“3x4yz”,"yyyyyyy"压缩后为“7y”.int main(){ char str[99] = "xxxyyyyz";//3x4yz int strLength = strlen(str); int count = 1;//记录重复个数 int i; for (i = 0; i < strLength; i++) { i...原创 2019-08-06 13:07:03 · 1378 阅读 · 0 评论 -
Summer 19
1.若有变量定义:int a = 5, *p = &a, *q = a; 则下面不能做的运算是 BA. a = (*p)*(*q); B. q = a; C. a = p - q; D. p = q;int *”与“int”的间接级别不同2.写一个表达式,表示一个整数 i 既是奇数又是3的倍数 i%2!=0 && i%3==03....原创 2019-08-06 13:02:59 · 854 阅读 · 1 评论 -
对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。测试样例 : “qywyer23tdd”, 返回 y
核心思想:后面元素与前一个元素比较,相等直接输出,否则 把当前元素写入数组中,便于下一次比较。char findFirstRepeat(char * c,int n) { char word[11]; int i, j; word[0] = *c;//把q赋给word[0] for (i = 1; i<n; i++) for (j = 0; j<i; j++){ ...原创 2019-08-01 20:29:58 · 2584 阅读 · 0 评论 -
Summer 7
1.设m和n都是int类型,那么以下for 循环语句 循环体一次也不执行int main(){ int m,n=-1; for (m = 0,n=-1; n=0; m++,n++) { n++; } system("pause"); return 0;}n=0的值是0,也就是说条件一直为FALSE,所以一次也不会执行。2.如下程序输出结果是什么int a =...原创 2019-07-28 14:16:15 · 282 阅读 · 0 评论 -
Summer 11
1.程序输出结果是 8int fun(char *s)//定义一个函数,传入参数为字符串{ char *p = s;//定义一个指针指向传入字符串的首地址 while (*p!='\0')//判断是否字符串结束标志‘\0’ { p++;//如果p指向的地址不为‘\0’的话,p指针后移一位char,直到为\0结束 } return(p - s);//返回字符串结尾到字符串开头...原创 2019-08-01 17:44:59 · 172 阅读 · 0 评论 -
Summer 6
以下程序的运行结果是//1.int fun(int a, int b){ if (a>b) { return(a + b); } else { return(a - b); }}int main(){ int x = 3, y = 8, z = 6, r; r = fun(fun(x, y), 2 * z); printf("%d\n", r);...原创 2019-07-28 08:45:38 · 99 阅读 · 0 评论 -
Summer 5
如下程序运行结果是1.int Change(int *pX){ int y = 8; y = y - *pX; pX = &y; return 0;}int main(){ int xx = 3; int *pY = &xx; Change(pY);// 值传递,不能改变指针 printf("%d\n", *pY);// 3 system("...原创 2019-07-27 19:15:16 · 151 阅读 · 0 评论 -
如何判断一个数 n 是否是2的K次方?
注意:不用求K是多少,只需要判断,请编写函数实现。核心思想:按位与(&), n = m & (m - 1);考虑2的k次方数的特点,每一个2的k次方数转化为2进制之后,只有一位为1,我们只需要判断二进制位上是不是只有一个1用m&(m - 1)就是在消除二进制位上的1,由于二进制位只有一个1, 所以 n = 0.#include<stdio.h>...原创 2019-08-05 14:06:28 · 880 阅读 · 0 评论 -
Summer 18
1. 对于以下代码,输出结果是 -1int main(){ char ch = -1; int i = -1; printf("%x\n", i); printf("%d\n", ch);//-1 system("pause"); return 0;}先扩展为int 那么对应的就是int类型的-1; 然后输出//-1//8位//原码1000,00...原创 2019-08-05 14:01:25 · 133 阅读 · 0 评论 -
求一个有序数组中两个元素值相加为K的数字,返回这两个元素的下标。
要求时间复杂度是O(n), 空间复杂度是O(1).核心思想:我们可以利用两个指针,一个头指针,一个尾指针。因为数组是有序排列的,我们只需计算头指针和尾指针对应数字的和与k的大小关系,若两数之和大于k,我们要做的就是让尾指针向前移动。若两个数字之和小于k,我们要做的就是让头指针向后移动。相等即返回下标#include<stdio.h>#include<stdlib....原创 2019-08-05 13:19:22 · 514 阅读 · 0 评论 -
Summer 17
1. switch(c) 中 c 的数据类型可以是 char, long, float, unsigned, bool, 这种说法 错误在C中是可以一切整型的(由于char实际上是ASCII码,所以也可以)都是可以的。float不可以。2. 如下程序的输出结果是 10int main(){ int i; char acNew[20] = { 0, 0, 0, 0, 0, 0, ...原创 2019-08-05 13:16:40 · 892 阅读 · 0 评论 -
Summer 10
1.关于以下代码,正确的说法是 char acX[] = "abc"; char acY[] = { 'a', 'b', 'c' }; char *szX = "abc"; char *szY = "abc";A acX和acY都是数组,当然可以修改B 因为"abc"是常量字符串,当它被多次使用时,编译器并不愿意再多分配出额外的内存空间存放多个"abc",而...原创 2019-07-31 19:52:11 · 329 阅读 · 0 评论 -
Summer 9
1.下面程序的输出结果为多少(32为机器上)void Func(char str_arg[2]){ int m = sizeof(str_arg); int n = strlen(str_arg); printf("%d\n", m);//4 printf("%d\n", n);//5}int main(void){ char str[] = "Hello"; Func...原创 2019-07-31 19:38:06 · 211 阅读 · 0 评论 -
模拟实现函数 pow(x,y) ,即实现运算x^y(x的y次方),这里x和y都为整数。
基本思想是,减少乘法次数,重复利用计算结果。例如:x^4,如果逐个相乘的话,需要四次乘法。如果我们这样分解(x^2)*(x^2)就只需要2次乘法,因为x^2的结果我们可以重复利用。所以我们最好做对称的分解指数y,然后求x^(y/2)的平方。具体算法如下:1 如果y为偶数,直接计算mypow(x, y/2)*mypow(x, y/2);2 如果y为奇数,则y-1为偶数,回到了第一种情况。...原创 2019-08-04 14:59:20 · 3317 阅读 · 2 评论