1.函數原型
size_t strlen(const char *string );
我們也可以打開MSDN查看他的原型
?2.函數功能:求一個字符串指定string字符串的長度
3.strlen函數的實現:
實現的思想是這樣的我們只要讓一個指針指向字符串的起始位置,讓他一直往后走直到遇到/0就停止在上述過程中用計數器count統計str走了多少步,count的值就是這個字符串的長度了
說明:
strlen() 函數計算的是字符串的實際長度,遇到第一個’/0’結束;
參數指向的字符串必須以 ’ /0 ‘結束
函數返回值一定是size_t ,是無符號的
如果你只定義沒有給它賦初值,這個結果是不定的,它會從首地址一直找下去,直到遇到’/0’停止
sizeof返回的是變量聲明后所占的內存數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen()是函數
這是特別要注意的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
代碼實現:
#include#includeint my_strlen(const char* str)//我們只是要求一下他的長度并不會修改他所以加const保護字符串{ assert(str);//斷言防止str為空指針 int count = 0; while (*str!="/0") { str++; count++;//計數 } return count;}int main(){ char arr[] = "abcd"; int ret=my_strlen(arr); printf("%d", ret);}
?方法2:遞歸方法(重點,以后面試可能會問到)
#include#includeint my_strlen(const char* str)//我們只是要求一下他的長度并不會修改他所以加const保護字符串{ assert(str);//斷言防止str為空指針 if (*str) { return 1 + my_strlen(++str); } else { return 0; }}int main(){ char arr[] = "abcd"; int ret=my_strlen(arr); printf("%d", ret);}
方法3:指針減指針
#include#includeint my_strlen(const char* str)//我們只是要求一下他的長度并不會修改他所以加const保護字符串{ assert(str);//斷言防止str為空指針 const char* start = str; const char* end = str; while (*end != "/0") { end++; } return end - start;}int main(){ char arr[] = "abcdf"; int ret=my_strlen(arr); printf("%d", ret);}
1.函數原型:
?2.函數功能:將參數str字符串拷貝到參數dest所指向的字符串的地址中.注入事項:strcpy拷貝的時候是要拷貝到"/0"才停止拷貝。所以一定要保證目的地空間足夠大.我strcpy的脾氣就是我要拷貝到‘/0"我才停止你空間足不足夠我才不關心,我只負責拷貝其他的我不管。
說明:
? ?1.? 源字符串必須以’/0’結束
? 2. 會將源字符串的’/0’拷貝到目標空間
? 3.目標空間必須可變
? 4. 如果參數dest所指的內存空間不夠大,可能會造成緩沖溢出的錯誤情況,在編寫程序時需特別留意,或者用strncpy()來取代
#include#includeint main(){ char arr1[] = "abcdef"; char arr2[] = "abc";char *ret=strcpy(arr2, arr1);printf(ret);}
在這個實驗中我們把arr1的內容拷貝到arr2中但是arr2中的空間只有4個字節而arr1是有7個字節,我們一起來看一下啊運行結果:
?我們可以看到雖然字符串arr1被拷貝到arr2中去了但此時程序已經崩潰了。所以我們在使用strcpy時一定要確保目的地空間足夠大。
3.代碼實現:
#include#includechar* my_strcpy(char* dest, const char* src){ assert(dest && src);//防止dest和src為空指針 char* ret = dest; while (*src) { *dest = *src; dest++; src++; } *dest = *src;//將src中的’/0"拷貝到dest中 return ret;}int main(){ char arr1[] = "abcdef"; char arr2[] = "abv"; char*ret=my_strcpy(arr1, arr2); printf(ret);}
運行結果:
?拷貝前:
拷貝后:
在上面這個版本上我們還可以進行改進:
#include#includechar* my_strcpy(char* dest, const char* src){ assert(dest && src);//防止dest和src為空指針 char* ret = dest; while (*dest++ = *src++) ; return ret;}int main(){ char arr1[] = "abcdef"; char arr2[] = "abv"; char*ret=my_strcpy(arr1, arr2); printf(ret);}
1.函數原型:
2.函數功能:
字符串進行比較
我們通過文檔我們可以知道:如果第一個字符串小于第二個返回的是小于0的數如果第一個字符串等于第二個返回的·是0如果第一個字符串大于第二個字符串返?回的是大于0的數字
原型:strcmp(str1,str2);
功能:比較兩個字符串,如果兩個字符串相等,則返回0;若str1大于str2(對于大于的理解,是指從兩個字符串的第一個字符開始比較,若兩個字符相同,則繼續比較,若發現兩個字符不相等,且str1中該字符的ASCII碼大于str2中的,則表示str1大于str2),返回一個正數(這個正數不一定是1);若str1小于str2,返回一個負數(不一定是-1);若字符串str1的長度大于str2,且str2的字符與str1前面的字符相同,則也相對于str1大于str2處理
區分大小寫比較的,如果希望不區分大小寫進行字符串比較,可以使用stricmp函數
?首先判斷第一個字符是否相等如果相等直接繼續往后走直到兩個不相等
3.代碼實現:
#includeint my_strcmp(const char* dest, const char* src){ assert(dest&&src); while (*dest == *src) { if (*dest == "/0")//如果dest等于‘/0"說明這兩個字符串相等相等返回0 { return 0; } dest++; src++; } return *dest - *src;//說明這兩個字符串不相等,返回他們第一不相等字符的差值}int main(){ char str1[] = "abcde"; char str2[] = "abcdrq"; int ret = my_strcmp(str1, str2); printf("%d", ret);}
1.函數聲明原型
?2.函數功能:字符串拼接函數
實現思路大致是:先找到dest’/0"的位置,然后從該位置將str中的內容向后面追加
追加前:
追加后:
?我們也可以調試看到:
注意!
1.源字符串必須’/0’結束
2. 目標空間必須可修改
3.strcat() 會將參數src字符串復制到參數dest所指的字符串尾部
4.dest最后的結束字符’/0’會被覆蓋掉,并在連接后的字符串的尾部再增加一個’/0’
5.dest與src所指的內存空間不能重疊,且dest要有足夠的空間來容納要復制的字符串
6.所以不能夠自己給自己拷貝因為’/0"已經被覆蓋了而strcat是要追加到‘/0"才停止追加!!!!!!!
代碼實現:
#include#include#includechar* my_strcat(char* dest, const char* src){ assert(dest && src); char* ret = dest; while (*dest) { dest++;//找到dest所指向的字符串"/0’的位置 } while (*dest++ = *src++) ; return ret;}int main(){ char str1[] = "abcded/0XXXXXXX"; char str2[] = "abc"; my_strcat(str1, str2); printf("%s", str1); return 0;}
1.函數原型
2.函數功能:
功能:在str字符串中查找首次出現字符c的位置(從字符串的首地址開始查找)
原型2:strrchr(str,c);
功能2:在字符串str中從后向前開始查找字符c首次出現的位置
3.代碼實現:
#include#includechar* my_strchr(const char* str, int ch){ assert(str); char* ret = (char*)str; while (*ret) { if (*ret ==(char) ch) { return ret; } ret++; } return NULL;}int main(){ char str[] = "abcdefhfmg"; char* tmp = my_strchr(str, "0"); if (tmp == NULL) { printf("找不到"); return 0; } printf("%c", *tmp);}
1.函數原型:
?2。函數功能:
查找一個字符c在一個字符串string最后一次出現的位置(也就是從字符串的右側開始查找字符c首次出現的位置)并返回從字符串中的字符c所在的位置開始直到結束的所有字符,如果沒有找到字符c則返回空指針即NULL
3.代碼實現:
#include#includechar* my_strrchr(const char* str,int ch){ assert(str); char* ret = NULL; while (*str) { if (*str == (char)ch) { ret = str; } str++; } return ret;}int main(){ char str[] = "abcdeabcef"; char* tmp = my_strrchr(str, "a"); printf(tmp);}
1.函數原型:
2.函數功能
功能:將字符串str2中的前n個字符復制到字符串str1的前n個字符中
注意:(1)不會清除str1中全部字符串,只會改變前n個字符串,
(2)n不能大于字符串str1、str2的長度
(3)但是如果使用strncpy_s便會清除str1中的全部字符串
說明:
- 如果src字符串長度小于n,則拷貝完字符串后,在目標后追加0,直到num個
- strncpy不會向dest追加’/0’
- src和dest所指的內存區域不能重疊,且dest必須有足夠的空間放置n個字符
3.代碼實現
#include#include#includechar* my_strncpy(char* dest, const char* src, int n){ assert(dest && src); char* tmp = dest; while ((n--) && (*dest++ = *src++)); if (n > 0) { while (n--) { *dest++ = "/0"; } } return tmp;}int main(){ char str1[] = "abcdeXXXXXXXXXXXX"; char str2[] = "avcdf"; char* ret =my_strncpy(str1, str2, 6); return 0;}
雖然比strncpy要安全一點但還是要注意要保證目的地空間足夠
1.函數原型:
?函數功能:
該函數會將字符串src的開頭拷貝n個字符到dest的尾部,dest要有足夠的空間來容納要拷貝的字符串,如果n大于src的長度,那么只會把src僅有的字符串內容追加到dest的尾部。strncat會將dest里面的‘/0’覆蓋掉字符追加完畢后自動加一個‘/0"
也就相當于這樣:
我們在上面那個長的字符串從下面這個字符串中追加2個字符那么結果將為:
通過調試我們也能夠證明上面這個是對的:
如果追加3個字符那么結果和上面是一樣的。大家可以做實驗驗證
注意!!!!!
- strncat將會從字符串src的開頭拷貝n個字符到dest字符串尾部
- dest要有足夠的空間來容納要拷貝的字符串
- 如果n大于字符串src的長度,那么僅將src全部追加到dest的尾部
- strncat會將dest字符串最后的’/0’覆蓋掉,字符追加完成后,再追加’/0’
代碼實現:
#include#include#includechar* my_strncat(char* dest, const char* src, int n){ assert(dest && src); char* ret = dest; while (*dest) { ++dest; } for (int i = 0; i < n; i++) { if (*src) { *dest = *src; dest++; src++; } else { break; } } *dest = "/0"; return ret;}int main(){ char str1[] = "abcde/0XXXXXX"; char str2[] = "avbv"; strncat(str1, str2, 2); return 0;}
1.函數原型:
2.函數功能:strncmp的功能和strcmp的功能和相似,只不過多了一個參數用來確定比較的個數
3。代碼實現:
#include#include#includeint my_strncmp(const char* dest, const char* src, int n){ assert(dest && src); while ((n--) && (*dest) && (*src) && (*src == *dest)) { src++; dest++; } return *dest - *src;}int main(){ char str1[] = "abcdef"; char str2[] = "abcf"; int ret = my_strncmp(str1, str2, 2); printf("%d", ret);}
函數原型:
?2.函數功能:
在字符串中找子串原理是string中是否包含strcharset如果包含就返回第一個出現字符的地址,如果沒有就返回空指針
3.代碼實現。
#include#includechar* my_strstr(const char* dest, const char* src){ assert(dest && src); if (!*src) { return (char*)dest; } const char* cur =dest; const char* s1; const char* s2; s1 = s2 = NULL; while (cur) { s1 = cur; s2 = src; while ((*s1) && (*s2) && (*s1 == *s2)) { s1++; s2++; } if (*s2 == "/0") { return (char*)cur; } cur++; } return NULL;//找不到字串}int main(){ char str1[] = "abcdef"; char str2[] = "bcdef"; printf(my_strstr(str1, str2));}
1.函數原型:
2.函數功能:
功能:根據分隔符將字符串分隔成一個個片段
返回值:返回下一個分割后的字符串指針,如果已無從分割則返回NULL
說明:
1.sep參數是個字符串,定義了用作分隔符的字符集合
2.第一個參數指定一個字符串,它包含了一個或者多個由sqp字符串中一個或者多個字符分割的標記
3.第一次調用時將字符串首地址傳進去,之后調用不用傳地址,內部會有static函數保存指向地址
4.分隔符不作為輸出內容,只做分界符
5. 當strtok在參數s的字符串中發現到參數sep的分割字符時則會將該字符改為’/0’字符
6. 在第一次調用時,strtok必須賦予參數str字符串,往后的調用則將參數s設置成NULL
7.strtok會修改原字符串,所以必須放至棧上
代碼實現:
char* strtok1(char* str, const char* sep){ static int ret = 0;//這個靜態變量也十分重要!當指針指向最后一個 字符串str 出現的 sep字符分隔符, //因為最后一段字符串并不會再出現sep中任何一個分隔符,所以字符串就不會打印, //那我們如何區分這種情況和str中就從來沒有出現過sep字符的情況,我們設置一個靜態變量,如果靜態變量被修改過,就輸出字符串,如果沒修改過就返回空指針。 static char* a = NULL; //這里要用到靜態變量,這樣函數結束變量就不會銷毀,a會記住上一次的地址 if (str != NULL) // 判斷是否為NULL { a = str; ret = 0; } else { if (ret == 2) return NULL; a++; } char* first = a; while (*a) { const char* p = sep; while (*p) { if (*p == *a) { *a = "/0"; ret = 1; return first; } p++; } a++; if (*a == "/0") { ret = 2; break; } } if (ret == 0) return NULL; else if(ret == 2) return first;}
其實這里還有一些函數博主就不一 一實現就在這里簡單的介紹一個就可以了
函數名稱 | 函數原型 | 函數功能 |
strerro | char*strerro(int errnom) | 1.返回錯誤碼,所對應的錯誤信息 2使用庫函數調用失敗的時候,都會設置錯誤碼并存儲在errno中 |
strpbrk | char* strpbrk(const char* str1, const char* str2) | 在字符串s1中尋找字符串s2中任何一個字符相匹配的第一個字符的位置,空字符NULL不包括在內 |
strcspn | size_t strspn(const char* str1, const char* str2) | 功能:用來計算str1字符串開始部分不匹配str2字符串的字符個數 返回字符串str1開頭部分不出現在字符串str2內的字符數目。 |
strspn | size_t strspn(const char* str1, const char* str2) | 功能:用來計算str1字符串開始部分匹配str2字符串的字符個數 返回字符串str1開頭連續包含字符串str2內的字符數目 |
函數名稱 | 函數原型 | 函數功能 |
atoi | int atoi(const char* str) | 功能:將字符串轉換成整型 返回轉換后的整型數。如果str不能轉換成int或者str為空字符串,那么將返回0 |
atof | double atof( const char *string ) | 將字符串轉換成浮點型 |
atol | long atol( const char *string ) | 將字符串轉換成浮點型 |
gcvt | char *_gcvt( double value, int digits, char *buffer ) | 將浮點型轉成字符串 |
itoa | char *_itoa( int value, char *string, int radix ) | 將整型轉換成字符串 |
? ? ? ? ? ? ? ? ? ? ? ? ?
函數名稱 | 函數原型 | 函數功能 |
strtod | double strtod( const char *nptr, char **endptr ) | 字符串轉換成浮點型 |
strtol | long strtol( const char *nptr, char **endptr, int base ); | 將字符串轉換成長整型 |
strtoul | unsigned long strtoul( const char *nptr, char **endptr, int base ); | 將字符串轉換成無符號長整型 |
toascii | int __toascii( int c ) | 將整型轉成合法的ASSll碼字符 |
_itot_s | errno_t?_itoa_s(int?value,?char?*buffer,?size_t?sizeInCharacters,?int?radix); ? | 將int轉換成char* |
_ttoi | 可以將Cstring 轉成整型 |
int atoi(const char* str)
2.函數功能
將字符串轉換成整數
注意:
返回值:每個函數返回?int?值,此值由將輸入字符作為數字解析而生成。?如果該輸入無法轉換為該類型的值,則atoi的返回值為?0。
工作原理:atoi通過全局變量來區分返回0的情況。
如果是非法輸入,返回0,并把這個全局變量設為特殊標志;
如果輸入是”0”,則返回0,不會設置全局變量。
使用該函數時要注意atoi返回的是int類型,注意輸入str的范圍不要超出int類型的范圍。
3.函數實現:
#include#include#include#include#includeint my_atoi(const char* str){ assert(str); long long ret = 0; int flag = 1; if (!*str) { return 0; } while (isspace(*str)) { str++; } if (*str == "+") { str++; } else if (*str == "-") { flag = -1; str++; } while (isdigit(*str)) { ret = ret * 10 + *str - "0"; if (ret > INT_MAX || ret < INT_MIN)//超出整型最大說明溢出了 { return 0; } str++; } if (*str == "/0") { return (int)ret*flag; } return (int)flag*ret;}int main(){ int tmp = my_atoi("-123"); printf("%d", tmp);}
代碼實現:
#include#includevoid my_reverse(char* str){ int right= strlen(str)-1; int left = 0; while (left
1.函數原型
double atof( const char *string )
2.函數功能
將字符串轉成浮點數
3.代碼實現
#include#include#includedouble my_atof(const char* str){ double ret = 0; int flag = 1; int count = 0; assert(str); while (isspace(*str)) { str++; } while (*str) { if (count) { count = count * 10; } if (*str == "+") { str++; } else if (*str=="-") { str++; flag = -1; } else if (*str == ".") { count++; str++; } else if ((*str>="0")&&(*str<="9")) { ret = ret * 10 + (double)(*str - "0"); str++; } else { return 0; } } return ret * flag / count;}int main(){ double tmp = my_atof("123.3abc"); printf("%.2lf", tmp);}
之前樓主遺漏了一些函數在這里補上
int isalnum(int c):檢查字符是否為數字或字母;(0~9,a~z,A~Z)?
int isalpha(int c):檢查字符是否為字母;(a~z, A~Z)?
int iscntrl(int c):檢查字符是否為控制字符;(八進制000~037以及177的字符)?
int isdigit(int c):檢查字符是否為十進制數字;(0~9)?
int isgraph(int c):檢查字符是否為圖形表示,依賴于使用語言的環境;0~9,a~z,A~Z,以及標點符號)?
int islower(int c):檢查字符是否為小寫的字母;(a~z)?
int isprint(int c):檢查字符是否為可打印的;(數字、字母、標點符號、空白字符)?
int ispunct(int c):檢查字符是否為標點符號;(! ” # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~等)?
int isspace(int c):檢查字符是否為空白字符;(TAB、換行、垂直TAB、換頁、回車、空格)?
int isupper(int c):檢查字符是否為大寫字母;(A~Z)?
int isxdigit(int c):檢查字符是否為十六進制數字;(0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f)?
字符串轉換函數:
int tolower(int c):轉化字符為小寫字母;
int toupper(int c):轉化字符為大寫字母;
關于字符串的函數就到此結束
下面博主介紹幾個內存操作函數:
1.函數原型:
void *memcpy( void *dest, const void *src, size_t count )
2.函數功能
內存拷貝,可以拷貝任意類型不考慮’/0’
功能:函數memcpy從src的位置開始向后復制count個字節的數據到dest的內存位置
說明:
- 這個函數在遇到’/0’不會停下來
- 如果src與dest任何的重疊,復制結果都是未定義的
- 1.src和dest所指內存區域不能重疊
2.與strcpy相比,memcpy遇到‘/0’并不會結束,而是一定會拷貝完n個字節
3.memcpy可以拷貝任何數據類型的對象,可以指定拷貝的數據長度
4.如果dest本身就有數據,執行memcpy()后會覆蓋原有的數據
5.dest和src都不一定時數組,任意的可讀寫的空間均可
6.如果要追加數據,則每次執行memcpy后,要將目標數組地址增加到所要追加數據的地址
?
原理如下:
3.代碼實現:
#include#includevoid* my_memcpy(void* dest, const void* src, int n){ assert(dest && src); void* ret = dest; while (n--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret;}int main(){ int arr1[10] = { 0 }; int arr2[] = { 1,2,3,4,5 }; my_memcpy(arr1, arr2, 20); for (int i = 0; i < 10; i++) { printf("%d ", arr1[i]); } return 0;}
1.函數原型
int memcmp( const void *buf1, const void *buf2, size_t count )
2.函數功能
功能:比較內存區域buf1和buf2的前count個字節。注意該函數是按字節比較的
返回值:
當buf1 < buf2時,返回值<0
當buf1 = buf2時,返回值=0
當buf1 > buf2時,返回值>0
3.代碼實現
#include#includeint my_memcmp(const void* str1, const void* str2, int num){ if (num == 0) { return 0; } assert(str1 && str2); char* s1 = (char*)str1; char* s2 = (char*)str2; while ((num--)&&(*s1==*s2)&&*s1&&*s2) { s1++; s2++; } return *s1 - *s2;}int main(){ int arr1[10] = { 1,2,3,4,5 }; int arr2[10] = { 5,2,3,5 }; int tmp = my_memcmp(arr1, arr2, 0); printf("%d", tmp);}
1.函數原型
void *memset( void *dest, int c, size_t count )
2.函數功能
功能:以str的起始位置開始的n個字節的內存區域用整數value進行填充
返回值:目標str內存起始地址
說明:按字節設置,進行賦值1.memset用來對一段內存空間全部設置為某個字符,一般用在對定義的字符串進行初始化為‘ ’或‘/0’
2.如果用malloc分配的內存,一般只能使用memset來初始化
3.memset可以方便的清空一個結構類型的變量或數組,它可以一字節一字節地把整個數組設置為一個指定的值
4.當結構體類型中包含指針時,在用memset初始化時需要特別小心這是因為當用memset初始化為0時會把指針初始化為NULL5.在使用memset給數組進行初始化時我們只能將數組中的每一個元素初始話為0或者-1,應為memset是一個字節一個字節進行初始化
3.代碼實現
#include#includevoid* my_memset(void* dest, int val, int num){ assert(dest); char* s1 = (char*)dest; void* ret = dest; while (num--) { *s1 = (char)val; s1++; } return ret;}int main(){ int arr[10]; my_memset(arr, 0, 40); for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); }}
1.函數原型
void* memchr(const char* ptr ,int value,sizez_t num)
2.函數功能
功能:從buf所指內存區域的前count個字節查找字符ch。
返回值:當第一次遇到字符ch時停止查找。如果成功,返回指向字符ch的指針;否則返回NULL
3.代碼實現
void* my_memchr(const void* dest, int c, int num){ assert(dest); char* ret = (char*)dest; while (num--) { if ((char)c == *ret) { return ret; } else { ret++; } } return NULL;}
1.函數原型
void*memmove(void *dest,const void*src,int num)
2.函數功能
用于內存拷貝的函數,沒有類型限制,但是memmove使用要考慮內存重疊問題
void?*?memmove(void?*?destination,?const?void?*?source,?size_t?num);
用于從src中拷貝num個任意類型的內容到dest,如果目標區域和源區域有重疊(并不是所有重疊情況都需要特殊處理),memmove能夠保證源串在被覆蓋之前將重疊區域的字節拷貝到目標區
3.代碼實現
void *my_memove(void* dest, const void* src, int num){ assert(dest && src); void* ret = dest; if(dest
最后介紹幾個數學函數
1.函數原型:
double sqrt( double x );
2.函數功能
計算一個非負實數的平方根
實現原理:
牛頓迭代法是一種可以用來快速求解函數零點的方法。
為了敘述方便,我們用 CC 表示待求出平方根的那個整數。顯然,CC 的平方根就是函數
y = f(x) = x^2 - C,y=f(x)=x?2??C的零點。
牛頓迭代法的本質是借助泰勒級數,從初始值開始快速向零點逼近。我們任取一個?x0??作為初始值,在
每一步的迭代中,我們找到函數圖像上的點 (x_i, f(x_i))(x?i?,f(x?i?)),過該點作一條斜率為該點導數 f"(x_i)f?′(x?i?) 的直線,與橫軸的交點記為 x_{i+1}x?i+1。x_{i+1}x?i+1相較于 x_ix?i?? 而言距離零點更近。在經過多次迭代后,我們就可以得到一個距離零點非常接近的交點。下圖給了從 x_0x?0開始迭代兩次,得到 x_1x?1和 x_2x?2的過程。
?
代碼實現:
int mySqrt(int x){long tmp = x; while (tmp*tmp > x) { tmp = (tmp + x/tmp) / 2; } return (int)tmp; }
1.函數原型
double pow( double x, double y )
2.函數功能
求a^b
原理:
?
代碼實現
double myPow(double x, int n) { if(x == 1 || n == 0) { return 1; } double tmp = 1; long count=n; if(n < 0){ count = -count; x = 1/x; } while(count) { if(count & 1) { tmp *= x; } x *= x; count>>= 1; } return tmp; }
1.函數原型:
int abs( int n )
2.函數功能
求絕對值
代碼實現
#includeint my_abs(int n){ int tmp = n >> 31; return (n ^ tmp) - tmp;}int main(){ int tmp = my_abs(10); printf("%d", tmp);}
最后博主在補充幾個數學函數:
函數名稱 | 函數原型 | 函數功能 |
fabs() | double fabs(double x) | 求雙精度的絕對值 |
exp() | double exp(double x) | 求指數e^x的值 |
log10() | double log 10 (double x) | 求log 10 x的值 |
pow10(int p) | double pow10(int p) | 返回10^p的值 |
?ceil | double ceil(double x) | 求不小于x的最小整數 |
floor | double floor(double x) | 求不大于x的最大整數 |
博主水平有限如有錯誤一定要向博主指出,一起進步。前路昭然,你我共進!!!!
覺得寫的不錯的可以點個贊 謝謝
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119117.html
摘要:語言在設計中考慮了函數的高效性和易用性兩個原則。在語言中,最常見的當屬函數了。以上就是一個函數,它被稱為語言的入口函數,或者主函數。例如和都是函數名。形式參數當函數調用完成之后就自動銷毀了。 ...
摘要:形式參數當函數調用完成之后就自動銷毀了。函數調用傳值調用函數的形參和實參分別占有不同內存塊,對形參的修改不會影響實參。函數的聲明一般出現在函數的使用之前。它其實就數組訪問的操作符。 ...
摘要:本文介紹了類的常用接口的使用,并對其進行了模擬實現,對模擬實現中涉及到的深淺拷貝問題進行了解析。在此之前,必須提到一個經典問題。為了解決淺拷貝問題,所以中引入了深拷貝。但是實際使用中需要是第一個形參對象,才能正常使用。 本文介紹了string類的常用接口的使用,并對其進行了模擬實現,對模擬實...
摘要:指針變量可以存放基本類型數據的地址,也可以存放數組函數以及其他指針變量的地址。數組名表示的是整個數組所占的字節數。在這里數組指針的類型是。這也是我們可以用數組指針來接收二維數組數組名的原因。 目錄 零.前言 一.指針的定義 二.指針類型的意義 1.指針類型決定了指針解引用時一次訪問幾個字...
閱讀 1744·2023-04-25 23:43
閱讀 915·2021-11-24 09:39
閱讀 719·2021-11-22 15:25
閱讀 1720·2021-11-22 12:08
閱讀 1090·2021-11-18 10:07
閱讀 2079·2021-09-23 11:22
閱讀 3346·2021-09-22 15:23
閱讀 2495·2021-09-13 10:32