2015-11-05 51 views
-1

好的,這裏是新手,但我需要一些關於如何開始編寫特定程序的幫助/見解。我不是要求某人爲我做這件事,我只是要求解決這個問題,因爲我實在不知道該如何開始。掃描一個有效的整數

我應該寫的程序是檢測有效整數。然而,在這個程序中,一個有效的整數定義爲如下:

  • 0或更多領先的空格,然後...
  • 一個可選的「+」或「 - 」後面...
  • 1個或多個數字,後跟非字母數字,但不是'。'後跟1位或更多位。

有效整數示例:「1234」,「1234」,「1234.」,「+1234」,「12 + 34」,「1234」,「1234 x」和「-1234」都是整數,並且「1234e5」,「e1234」,「1234.56」和「1234abc」都不是。

到目前爲止,我所能想到的是使用一堆if語句來檢查有效整數,但我不能幫助,但我認爲必須有比使用大量if語句檢查更好更強大的方法字符串的每個字符。除了使用isdigit()和strtol()之外,我想不出任何對我有用的函數嗎?任何意見,將不勝感激。

+0

由於這看起來像一個計算機科學的鍛鍊,有可能是邊界的運動(禁止的現成的轉換函數的用法等)。也就是說,我有兩個詞給你:正則表達式。 –

+0

'man strtol':「字符串可以以任意數量的空格開頭(由isspace(3)確定),後跟一個可選的'+'或' - '符號。」只有非標準程序是禁止清除浮點值(前導期);但這就是它的'** endptr'。 – usr2564301

+0

如果它真的是一個CS練習,那麼你應該使用簡單的代碼,而不是正則表達式。所以用複雜的邏輯檢查所有字符。 – abbath

回答

2

您只需要檢查循環中的每個字符並隨時保留一個狀態機,直到您確定它無效或到達最後。

編輯:if語句沒有錯,或者你可以使用switch語句。

+2

+1對**不**提供完整的解決方案或使用正則表達式或類似的。只需添加OP應該看看'ctype.h'。 – Olaf

1

我可能會使用sscanf(或的fscanf等)

雖然不支持全正則表達式,scanf格式字符串做支持scan set的轉換,這是關於像在正則表達式中設置一個字符(包括倒數字符,例如%1[^a-zA-Z0-9]匹配單個非字母數字字符)。

格式字符串中的單個空格與輸入中的任意數量的空白匹配。

+0

這聽起來像是生成一個lexxer的練習。使用'scanf'或者regexp會是個不好的建議。 – Olaf

+0

至少對我來說,它看起來/聽起來很奇怪,作爲一個練習。我沒有看到任何證據證明它是正確的(除非你確定它是,編寫自己的詞法分析器用於scanf可以快速而輕鬆地完成的事情只是一個壞主意)。 –

+0

您從未編程過嵌入式系統嗎?即使你有'scanf'可用,它通常更快,並且沒有太多的努力來自己解析。誰知道?這可能會在未來的一步中擴大。 – Olaf

0

看看strtol(),它可以通過指針返回來告訴你有關字符串的無效部分。

並提防熱情的示例代碼..請參閱手冊頁以獲取全面的錯誤處理。

+0

OP詢問語法檢查,而不是讀取/轉換。而'strtol'不符合給定的語法。 – Olaf

+1

'strtol()'很好地符合OP要求的第一部分:'WS,sign,digits' – chux

1

將您的文字放到代碼中 - 一次一個。僞代碼如下

// to detect valid integers. 
success_failure detect valid integers(const char *s) { 

    // 0 or more leading white spaces followed by... 
    while (test_for_whitespace(*s)) s++; 

    // an optional '+' or '-' followed by... 
    if (test_if_sign(*s)) s++; 

    // 1 or more digits, ... 
    digit_found = false; 
    while (test_if_digit(*s)) { s++; digit_found = true; ] 
    if (!digit_found) return fail; 

    // followed by a non-alphanumeric, but not a '.' followed by 1 or more digits. 
    if (is_a_non_alphanumeric_non_dp_not_null(*s)) { 
    s++; 
    digit_found = false; 
    while (test_if_digit(*s)) { s++; digit_found = true; ] 
    if (!digit_found) return fail; 
    } 

    if (is_not_a_null_character(*s)) return fail; 
    return success; 
} 
+1

給一個人一條魚而不是教他如何釣魚是一個壞主意。伊莫這已經太完整了。 – Olaf

+0

@Olaf編輯你的喜好。 – chux

+0

我肯定不會。無論如何,這已經太晚了,因爲貓已經開箱了。 – Olaf