日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言 atoi 函数解析

發(fā)布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言 atoi 函数解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • atoi函數(shù)的介紹
  • atoi函數(shù)的使用
  • atoi函數(shù)的自我實(shí)現(xiàn)
  • 附:C++完整無缺版自我實(shí)現(xiàn)
  • 寫在最后

前言

  • 對于atoi函數(shù)大家可能會有些陌生,不過當(dāng)你選擇并閱讀到這里時,請往下閱讀,我相信你能對atoi函數(shù)熟悉
  • 該函數(shù)的頭文件為 <stdlib.h> 或 <cstdlib>

atoi函數(shù)的介紹

此函數(shù)的功能是將數(shù)字字符的字符串轉(zhuǎn)化為字面上的整型返回,例如:

char arr[] = "1234"; 將”1234-> 1234(int)

以下是函數(shù)原型:

要注意的點(diǎn):

  • 如果字符串從開頭就有連續(xù)的空格字符,則跳過這些連續(xù)的空格字符,找到不是空格的字符。
  • 如果跳過這些空格字符后的第一個字符不是數(shù)字字符,則直接返回0;
  • 如果跳過這些空格字符后的第一個字符是數(shù)字字符,則從這個數(shù)字字符開始轉(zhuǎn)換,并向后找連續(xù)的數(shù)字字符轉(zhuǎn)換 ,如果連續(xù)中斷,找到不是數(shù)字字符的字符,則在此截?cái)鄬ふ?#xff0c;返回前面已經(jīng)轉(zhuǎn)換好的連續(xù)的數(shù)字字符字面整型值。(這里截?cái)嘞蚝髮ふ液?#xff0c;不管后面有沒有數(shù)字字符函數(shù)都不管)

  • 如果字符串首元素不是空格字符
  • 如果第一個字符不是數(shù)字字符,直接返回0。
  • 如果第一個字符是數(shù)字字符, 則從這個數(shù)字字符開始轉(zhuǎn)換,并向后找連續(xù)的數(shù)字字符轉(zhuǎn)換 ,如果連續(xù)中斷,找到不是數(shù)字字符的字符,則在此截?cái)鄬ふ?#xff0c;返回前面已經(jīng)轉(zhuǎn)換好的連續(xù)的數(shù)字字符字面整型值。

  • 如果字符串全部為空格字符,返回0;如果為空字符串,返回0;

atoi函數(shù)的使用

  • 有了上面的介紹,使用的意圖變得明顯,使用起來也就隨手就來了。

例如:

#include <stdio.h> #include <stdlib.h>int main() {char a[] = "";char b[] = " ";char c[] = "66666";char d[] = " @. 66ab";char e[] = " 6666@qq.com";char f[] = "520hehe";char g[] = "i love you 555";printf("%d\n", atoi(a));printf("%d\n", atoi(b));printf("%d\n", atoi(c));printf("%d\n", atoi(d));printf("%d\n", atoi(e));printf("%d\n", atoi(f));printf("%d\n", atoi(g));return 0; }

看上的結(jié)果,是不是就與介紹當(dāng)中的點(diǎn)都對應(yīng)起來了呢?

atoi函數(shù)的自我實(shí)現(xiàn)

有了上面的鋪墊,我們已經(jīng)了解了該函數(shù)的特性,所以接下來的實(shí)現(xiàn)也就變的簡單了

  • 跳過空格字符(也可能沒有,就不跳直接開始判斷轉(zhuǎn)換);
  • 跳過后開始判斷轉(zhuǎn)換;
  • 無論何種方式開始判斷第一個字符,如果不是數(shù)字字符,直接返回0。
  • #include <stdio.h> #include <assert.h>// 數(shù)字ASCLL碼值范圍為 48—57int my_atoi(const char* str) {assert(str);const char* tmp = str;while (*tmp == ' ') // 跳過空格字符tmp++;int num = 0; // 轉(zhuǎn)換數(shù)字字符值的接收變量// 如果是數(shù)字字符,就進(jìn)來,到不連續(xù)處就停止while (*tmp <= 57 && *tmp >= 48) {num = num * 10 + (*tmp - '0');if (*(tmp + 1) < 48 || *(tmp + 1) > 57){return num;}tmp++;}// 如果開始判斷的字符不是數(shù)字字符,前面的循環(huán)不進(jìn)去,這里直接返回0return 0; }int main() {char a[] = "";char b[] = " ";char c[] = "66666";char d[] = " @. 66ab";char e[] = " 6666@qq.com";char f[] = "520hehe";char g[] = "i love you 555";printf("%d\n", my_atoi(a)); // 0printf("%d\n", my_atoi(b)); // 0printf("%d\n", my_atoi(c)); // 66666printf("%d\n", my_atoi(d)); // 0printf("%d\n", my_atoi(e)); // 6666printf("%d\n", my_atoi(f)); // 520printf("%d\n", my_atoi(g)); // 0return 0; }

    附:C++完整無缺版自我實(shí)現(xiàn)

    前面C語言實(shí)現(xiàn)的atoi函數(shù)不夠嚴(yán)謹(jǐn),這里用c++實(shí)現(xiàn)嚴(yán)謹(jǐn)?shù)腶toi函數(shù)

    class Solution { public:int myAtoi(string s) {int flag = 1; // 操作正負(fù)數(shù)reverse(s.begin(), s.end()); // 先逆置while (s.size() > 1 && s.back() == ' ') s.pop_back(); // 除去前導(dǎo)‘0’ ,如果全是‘0’保留一個‘0’返回if (s.back() == '-') flag = -flag, s.pop_back(); // 利用flag來控制正負(fù)情況else if (s.back() == '+') s.pop_back();if (s.back() < 48 || s.back() > 57) return 0; // 前面的工作完成后開始判斷第一個位置是不是數(shù)字字符long long ret = 0; // 怕存爆整型while (s.size() > 0){// 這一步如果存的時候就已經(jīng)超過了int最大或小于最小,直接返回最大或最小if ((int)ret != ret) if (ret * flag < 0) return INT_MIN;else return INT_MAX;if (s.back() >= 48 && s.back() <= 57){// 每操作一次就刪除那個數(shù)字字符ret = ret * 10 + (s.back() - '0');s.pop_back();}else{// 找到第一個不是數(shù)字字符就跳出break;}}ret *= flag;if ((int)ret != ret)if (ret < 0) return INT_MIN;else return INT_MAX;else return (int)ret;} };

    寫在最后

    相信你已經(jīng)對這個函數(shù)了如指掌了,認(rèn)識掌握的函數(shù)越多,當(dāng)然是沒有壞處只有好處的。經(jīng)過對atoi函數(shù)的學(xué)習(xí),我相信你也會感覺到這個函數(shù)有好處也有缺陷,不過得用且用吧,在用的時候一定要腦子清醒,不要到頭來罵這個函數(shù),哈哈哈哈。

    感謝閱讀本小白的博客,錯誤的地方請嚴(yán)厲指出噢!

    總結(jié)

    以上是生活随笔為你收集整理的C语言 atoi 函数解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。