string类的成员函数c_str()
c_str()函数原型:const char *c_str(void)
c_str()函数功能: 当程序用到atoi()、strcpy()这类的C函数时要求参数为char*型,就要将string类字符串转换成char型字符串;(string是个类,char是个常规类型)
c_str()函数实现:
1 #include <iostream> 2 using namespace std; 3 4 //定义一个简易的string类,实现将传进来的任意类型的字符串 储存到 char*指针指向的空间里 5 class my_string 6 { 7 public: 8 my_string(const char* str = nullptr) 9 { 10 if(nullptr == str) //写判断语句时常量要写在前面,以减少出错(万一少些一个 '=' 系统会报错) 11 { 12 data = nullptr; 13 } 14 else 15 { 16 data = new char[strlen(str)+1]; //+1 是因为有 '\0' 17 strcpy(data,str); //只能strcpy(char* dest,const char* src)这一种参数形式 18 } 19 } 20 const char* c_str(void) 21 { 22 return data; 23 } 24 private: 25 char* data; // 用于储存 char* 字符串 26 }; 27 int main(void) 28 { 29 my_string s("hello world!"); 30 cout << s.c_str() << endl; 31 return EXIT_SUCCESS; 32 }
上式代码中有提到的strcpy,
strcpy()函数原型:char* strcpy(char *dest, const char *src)
strcpy()函数功能:复制两个char型字符串,而且他们可以是空,但不可以指向一个地址不然达不到想要的效果(memcpy可以复制两个指向一个地址空间的变量/类/结构体)
strcpy()函数实现:
1 char *my_strcpy(char *dest, const char *src) 2 { 3 char *ret = dest; 4 while(( *(dest++) = *(src++) ) != '\0'); 5 return ret; 6 }
memcpy()函数原型:void *memcpy(void *dest,const void *src,size_t size)
memcpy()函数功能:从源src指向的内存地址的起始位置开始 拷贝size个字节到 目标dest所指的内存地址的起始位置中
memcpy()函数实现:
1 void *my_memcpy(void *dest, const void *src,size_t size) 2 { 3 assert(nullptr != dest && nullptr != src);//有些时候只能用 (#define打开调试/#undef关闭调试) #ifdef ...#endif来选择 不同于头文件中的#ifndef..#define..#endif 4 void *ret = dest; 5 if(dest <= src || (char*)dest >= (char*)src + size)//源地址不低于目标地址或不重叠,正常拷贝 6 while(size--) 7 { 8 *(char*)dest == *(char*)src; 9 dest = (char*)dest + 1; 10 src = (char*)src + 1; 11 } 12 else //源地址低于目标地址,高字节向低字节拷贝 13 { 14 dest = (char*)dest + size - 1; 15 src = (char*)src + size - 1; 16 while(size--) 17 { 18 *(char*)dest == *(char*)src; 19 dest = (char*)dest - 1; 20 src = (char*)src - 1; 21 } 22 } 23 return ret; 24 }
atoi()函数原型:int atoi(const char *nptr)
atoi()函数功能:将char型 字符串数字转化成整形数字,将传进来的字符串数*nptr逐个转化成数字,首先从一个非空白符的数字或者正负号开始,一旦开始遇到非数字结束。
atoi()函数实现:
1 int my_atoi(const char *nptr) 2 { 3 int integer_sign = 1; 4 int ret_integer = 0; 5 assert(nptr); 6 7 while(isspace((int)*nptr) != 0) //跳过开头的空格符。while(isspace((int)*nptr) != 0)等价于while(isspace(*nptr) != 0) 调用时char型会自动转化成int型 8 { 9 cout << (int)*nptr << endl; 10 ++nptr; 11 } 12 13 if(*nptr == '-') //储存符号 14 integer_sign = -1; 15 16 if(*nptr == '+' || *nptr == '-') //跳过多余的符号 17 ++nptr; 18 19 while(*nptr >= '0' && *nptr <= '9') //开始转化,只接纳数字的转换 20 { 21 ret_integer = ret_integer*10 + *nptr - '0'; 22 ++nptr; 23 } 24 25 ret_integer = integer_sign*ret_integer; 26 27 return ret_integer; 28 }
上文中提到的isspace函数
isspace函数原型:int isspcae(int _C)
isspace函数功能:检查参数c是否为空格字符,也就是判断是否为空格(' ')、水平定位字符('\t')009、归位键('\r')013、换行('\n')010、垂直定位字符('\v')011或翻页('\f')012的情况。若为空格符返回TRUE(!=0),否则NULL(=0)
isspace函数实现:
1 int my_isspace(int _C) 2 { 3 return (unsigned int)(_C - 9)<5u || _C == ' ';//\t水平制表(HT)009 \n换行(LF) 010 \v垂直制表(VT)011 因为\f换页(FF)012 \r回车(CR)013 4 }
同理还有一个isprint函数
isprint()函数原型:extern int isprint(char c)
isprint()函数功能: 判断字符c是否为可打印字符(含空格),当c为可打印字符(0x20-0x7e)时,返回非零值,否则返回零。
isprint()函数实现:
1 #include <iostream>] 2 int my_isprint(char _C); 3 int main() 4 { 5 int c; 6 //clrscr(); // clear screen 7 c='a'; 8 printf("%c:%s\n",c,my_isprint(c)?"yes":"no"); 9 c=' '; 10 printf("%c:%s\n",c,my_isprint(c)?"yes":"no"); 11 c=0x7f; 12 printf("%c:%s\n",c,my_isprint(c)?"yes":"no"); 13 getchar(); 14 return 0; 15 } 16 17 int my_isprint(char _C) 18 19 { 20 return (unsigned int)(_C - ' ') < 127u - ' '; //判断字符c是否为可打印字符(含空格)。当c为可打印字符(0x20-0x7e)时,返回非零值,否则返回零。 21 }
有待完善的string 函数~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
黑马基础班第一天的课程
各种进制的表示形式 = 十进制的计算方法以及表现形式
1234(十进制) = 1*10^3 + 2*10^2 + 3*10^1 + 4*10^0(=1234)
2322(八进制) = 2*8^3 + 3*8^2 + 2*8^1 + 2*8^0(=1234)
4D2(十六进制) = 4*16^2 + 13*16^1+ 2*8^0(=1234)
10011010010(二进制) = 1*2^10 + 0*2^9 + 0*2^8 + 1*2^7 + 1*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0(=1234)
各进制之间的转换:
1 //进制之间的转换(纯C编程)。读者可以使用C++的string和stack编写会更加快捷 2 //因为stack 先进后出的功能和适合该编程。 3 //stack的基本操作 4 //1.入栈:如s.push(x); 5 //2.出栈:如 s.pop().注意:出栈操作只是删除栈顶的元素,并不返回该元素。 6 //3.访问栈顶:如s.top(); 7 //4.判断栈空:如s.empty().当栈空时返回true。 8 //5.访问栈中的元素个数,如s.size(); 9 #include <iostream> 10 #include <math.h> 11 12 using namespace std; 13 14 void TenTooAll(); //十进制 → 二、八、十六进制 15 void TwoTooTen(); //二进制 → 十进制 16 void EightTooTen(); //八进制 → 十进制 17 void SixtteenTooTen(); //十六进制 → 十进制 18 19 int main() 20 { 21 while(1) 22 { 23 cout << "您即将输入的是几进制数:(如果您要退出前按数字0,谢谢!)" << endl; 24 int quit = 1; 25 int choice; 26 cin >> choice; 27 switch(choice) //选择要输入的进制 28 { 29 case 0:quit = 0;break; 30 case 10:TenTooAll();break; 31 case 2:TwoTooTen();break; 32 case 8:EightTooTen();break; 33 case 16:SixtteenTooTen();break; 34 default:cout << "您的输入不是已有进制" << endl;break; 35 } 36 if(0 == quit) 37 break; 38 } 39 40 return 0; 41 } 42 43 void TenTooAll() //十进制 → 二、八、十六进制 44 { 45 cout << "请你输入一个整形数:" << endl; 46 int number; 47 cin >> number; 48 cout << "您要转换成的进制是:" << endl; //选择要转换的进制 49 int system; 50 cin >> system; 51 if(number == 0) 52 { 53 cout << "十进制数:" << number << "转换成" << system << "进制数是:" << number <<endl; 54 } 55 else 56 { 57 cout << "十进制数:" << number << "转换成" << system << "进制数是:"; 58 int i=0; 59 int a[100]; 60 char b[100]; 61 memset(a,0,100*sizeof(int)); // 一般情况不清零是没法用的 62 memset(a,0,100*sizeof(char)); 63 64 //输出为16进制时———————————————— 65 if(system == 16) 66 { 67 for(; number > 0; ++i) 68 { 69 int single; 70 single = number % system; // 求余 71 if(single > 9) 72 { 73 single = single -10+65-48;//因为single是int型 所以变成ASCII码值要变回int型 74 } 75 else 76 { 77 single = single + 48 -48;//便于阅读 78 } 79 80 b[i] = single +48; // 将int型转换成char型 81 number = number / system; 82 } 83 84 //倒序输出————————-—————— 85 for(int j = i-1; j >= 0; --j) 86 { 87 if(b[j] > '9') 88 { 89 cout << b[j]; //输出字母 90 } 91 else 92 { 93 cout << b[j]-48; //输出数字 94 } 95 96 } 97 } 98 99 //输出为二、八进制时———————— 100 else 101 { 102 for(; number > 0; ++i) 103 { 104 int single; 105 single = number % system; 106 number = number / system; 107 a[i] = single; 108 } 109 for(int j = i-1; j >= 0; --j) 110 { 111 cout << a[j]; 112 } 113 } 114 cout << endl; 115 } 116 117 } 118 119 120 121 void TwoTooTen() 122 { 123 cout << "请你输入一个整形数:" << endl; 124 char enter;//用于接收回车键 125 char number[100]; 126 enter = cin.get(); 127 cin.getline(number,100,'\n');//输入遇到回车键 就结束 128 if(number-48 == 0) 129 { 130 cout << "二进制数:" << number << "转换成十进制数是:" << number <<endl; 131 } 132 else 133 { 134 cout << "二进制数:" << number << "转换成十进制数是:"; 135 int i=0; 136 int total = 0; 137 for(; i < strlen(number); i++) 138 { 139 140 total = total + (number[strlen(number)-1-i] - '0') * pow(2,i); //此处要-1因为字符串有保存'\0' 且 数组下标从0开始 141 142 } 143 cout << total << endl; 144 } 145 } 146 147 void EightTooTen() 148 { 149 cout << "请你输入一个整形数:" << endl; 150 char enter;//用于接收回车键 151 char number[100]; 152 enter = cin.get(); 153 cin.getline(number,100,'\n'); 154 if(number-48 == 0) 155 { 156 cout << "二进制数:" << number << "转换成十进制数是:" << number <<endl; 157 } 158 else 159 { 160 cout << "二进制数:" << number << "转换成十进制数是:"; 161 int i=0; 162 int total = 0; 163 for(; i < strlen(number); i++) 164 { 165 166 total = total + (number[strlen(number)-1-i] - '0') * pow(8,i); 167 168 } 169 cout << total << endl; 170 } 171 } 172 173 174 void SixtteenTooTen() 175 { 176 cout << "请你输入一个整形数:" << endl; 177 char enter;//用于接收回车键 178 char number[100]; 179 enter = cin.get(); 180 cin.getline(number,100,'\n'); 181 if(number-48 == 0) 182 { 183 cout << "二进制数:" << number << "转换成十进制数是:" << number <<endl; 184 } 185 else 186 { 187 cout << "二进制数:" << number << "转换成十进制数是:"; 188 int i=0; 189 int total = 0; 190 for(; i < strlen(number); i++) 191 { 192 if(number[strlen(number)-1-i] >= 'A')// 193 total = total + (number[strlen(number)-1-i] - 7 - '0') * pow(16,i); //将字母转化成相应的数字 194 else 195 total = total + (number[strlen(number)-1-i] - '0') * pow(16,i); 196 } 197 cout << total << endl; 198 } 199 }
c语言的32个关键字:
c语言的34种运算符:
c语言的9种控制语句:
常用CMD-DOS指令:
用vs打开记事本、网站等操作:
1 #include <stdlib.h> 2 3 void main() 4 { 5 system("notepad"); 6 //system("start notepad");//并行 进程 7 system("taskkill /f /im notepad.exe");//关闭程序 8 system("calc"); 9 system("ipconfig"); 10 system("tasklist"); 11 system("netstat -a"); 12 system("D:\\Users\\Administrator\\AppData\\Roaming\\360se6\\Application\\360se.exe www.qq.com");//如果目录有空格 就加"\" \""字符 13 system("pause"); 14 }
黑马基础班第二天的课程
用不同的方法输出 h
1 //#include <windows.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 6 void main() 7 { 8 char str[50] = "hello world!"; 9 printf("%x",&str); 10 putchar(10); 11 //MessageBoxA(0,"朱碧云在玩游戏,所以网络故障!","网络断开",2); 12 //ShellExecuteA(0,"open","c:\\",0,0,1);//比system强大 13 //system("c:\\"); 14 //前面三个0是系统+默认,后面1是正常打开,如果是0 就是隐藏打开 3最大化 6最小化 15 16 //while(1) 17 //{ 18 // malloc(10000000); 19 // Sleep(1000);//休眠1000毫秒=1秒 20 //} 21 22 printf("h"); 23 printf("%s","h"); 24 printf("%c",'h'); 25 putchar('h'); 26 printf("\n"); 27 putchar(104);//10进制 28 putchar(0150);//8进制 29 putchar('\150');//8进制 30 putchar(0x68);//16进制 31 putchar('\x68');//16进制 32 putchar(1101000); 33 putchar('\n'); 34 35 //char str[50] = "hello world!";//在C语言里,变量只能在函数的开头处声明和定义 36 putchar(10); 37 printf("hello world!"); 38 putchar(10); 39 sprintf(str,"%s","hello world!"); 40 printf(str); 41 putchar(10); 42 sprintf(str,"%c%c%c%c%c",'h','e','l','l','o'); 43 printf(str); 44 getchar(); 45 }
黑马基础班第三天的课程
SHRT_MAX;//#include <limits.h> #define SHRT_MAX 32767
变量a与b兑换数据:
1 void temp(int &a,int&b) 2 { 3 int a = 100, b = 10; 4 5 //方法一: 6 int temp; 7 temp = a; 8 a = b; 9 b = a; 10 11 //方法二: 12 a = a + b; 13 b = a - b; 14 a = a - b; 15 16 //方法三: 17 a = a * b; 18 b = a / b; 19 a = a / b; 20 }
1 //设置随机数 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <time.h> 5 6 void main() 7 { 8 int num; 9 time_t time1; 10 srand((unsigned)time(&time1)); 11 num = rand() % 100; //(0到100) 12 num > 50 ? system("mspaint"):system("tasklist"); 13 14 getchar(); 15 }
1 //设置极大值(极小值) 2 #include <limits.h> 3 #include <float.h> 4 5 void main() 6 { 7 SHRT_MAX; 8 INT_MAX; 9 UINT_MAX; 10 FLT_MAX; 11 DBL_MAX; 12 }
sizeof('a') = 4; //C语言为了空间的拓展,字符常量设置为4个字节
1 //sprintf的用法 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 void main() 6 { 7 char str1[10] = "ged"; 8 char str2[10] = "i"; 9 char str3[10]; 10 sprintf(str3,"%s%s%c",str1,str2,'t'); 11 printf("%s",str3); 12 13 getchar(); 14 }
数据类型的隐式转换:short→int→unsigned→long→double←float,强制转换:如 (int)x;
二进制的输入函数:int str[30]; _itoa(num,str,8);//将数据num用8进制保存在str数组中;
偷钱:将123.345 小数点后第三位五舍六入,然后将小数点后第二位四舍五入。
算法:123.345*100→12334.5+0.4→(int)(12334.9)→12334/10→1233.4+0.5→(int)(1233.9)→1233/10
即:x = 123.345;
y = (int( ( ((int)(x*100f+04f))/10f ) +0.5f ) )/10f;
黑马基础班第七天的课程
字符常量:
算法的流程图:
函数的递归调用:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
函数调用规则:调用函数没有执行完成之前,不会执行下一步,没有执行完的语句块会进制压栈,执行到最后会返回执行。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int Febc(int n); 5 void change(int n); 6 void main() 7 { 8 printf("%u",Febc(44));//会调用很多次,想当耗内存 9 change(10); 10 getchar(); 11 12 } 13 14 int Febc(int n) 15 { 16 if(1 == n) 17 { 18 19 return 1;//函数调用结束出口 20 } 21 else if(2 == n) 22 { 23 return 2; 24 } 25 else 26 { 27 return (Febc(n-1)+Febc(n-2)); 28 } 29 } 30 31 void change(int n) 32 { 33 if(1 == n) 34 { 35 printf("%d", n);//进行压栈 36 } 37 else 38 { 39 change(n / 2); 40 printf("%d", n % 2);//进行压栈,并且逆序输出余。 41 } 42 }