請實現乙個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100",「5e2」,"-123",「3.1416"和」-1e-16"都表示數值。 但是"12e",「1a3.14」,「1.2.3」,"±5"和"12e+4.3"都不是。
首先,我們要明確表示數值的字串的遵循模式為下圖所示:
注意
1、其中a不是必需的,但是在此情況下小數部分不能為空
2、關於符號:a和c是以『+』或『-』開頭的0-9的數字串,b是不能以『+』或『-』開頭的0~9的數字串
3、a和c都是整數(可以有正負號也可以沒有),b是乙個無符號整形
掃瞄規則:如果遇到起始處有+』或『-』,就是a部分;如果遇到起始處有『.』,就是b部分;如果是e或者e就是c部分。
**實現我們總共分為三個函式。
scanb函式實現如下:
bool
scanb
(const
char
** str)if(
*str > before)
//表示有字元型別存在
return
true
;}
scana函式實現如下:
bool
scana
(const
char
** str)
return
scanb
(str)
;}
isnumber函式實現如下:
bool
isnumber
(const
char
* str)
int i =0;
//驗證a,必須是字元型別
bool isnumber =
scana
(&str)
;//遇到'.'驗證bif(
*str ==
'.')
//遇到'e/e',驗證cif(
*str ==
'e'||
*str ==
'e')
//到字串結尾返回結果if(
(isnumber &&
*str)
=='\0'
)else
}int
main()
else
}
在此,我們要解釋一下判斷b裡面||的用法和判斷c裡面&&的用法。
||的作用
:小數可以沒有整數部分。因為只要scanb返回為真說明有掃瞄到0-9的數字,則後面numeric表示式可以不用判斷。
【舉個栗子】.123等於0.123;小數點後面可以沒有數字,例如123.等於123.0;當然小數前面和後面都可以有數字,例如123.123。這就解釋了為什麼我們用||。
&&的作用
:當e或e前面沒有數字時,整個字串不能表示數字,如.e1、e1;當e或e後面沒有數字時,整個字串不能表示數字,如12e。
劍指Offer 表示數值的字串
題目 請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。基本思路 字串應滿足通式a b e ec 或者.b e ec 其中,a c表示有 或無 ...
表示數值的字串 劍指offer
這道題寫起來比較繁瑣,需要考慮 號是否出現在第乙個位置,是否出現一次,以e為分割前後是不是正確的格式,e前可以為浮點數或者整數,e後只能是整數。因此如果把函式分成三個子函式來寫就好多了,乙個函式判斷是不是整數,乙個判斷是不是浮點數,乙個判斷e前後是否合法。include include bool i...
劍指offer 表示數值的字串
請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。本題考查對字串的程式設計能力,我們需要從不同型別的數值中分析規律,要全面考慮數值整數,小數,指...