首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

內聯組語判斷字串格式是否為「數字+字母a」模式

     編輯:程式設計綜合問答

需求

在 C 語言內聯組語中判斷輸入字串是否符合「一個或多位數字後接字母 'a'」模式(如 `1a`, `20a`, `123a`)。

思路:採用「狀態機」或「正則邏輯」轉組語

因組語無現成正則引擎,建議在 C 層面用 `sscanf` 或手寫解析,僅將關鍵比較下放至組語。但若教學要求純組語實現,可參考以下邏輯:

演算法步驟

  1. 逐字元讀取,狀態 0:預期數字 (0-9)。
  2. 遇到數字 → 狀態 1(已讀至少一數字),繼續讀數字。
  3. 狀態 1 遇到 'a' → 成功,且字串結束(或僅剩空白)。
  4. 其他情況 → 失敗。

x86 內聯組語示意 (GCC 風格)

int is_digit_a(const char *s) {
    int result = 0;
    __asm__ (
        "movl %1, %%esi\n"      // 字串指標 -> ESI
        "xorl %%eax, %%eax\n"   // EAX = 0 (結果)
        "xorl %%ecx, %%ecx\n"   // ECX = 0 (狀態: 0=未讀數字, 1=已讀數字)
        "1:\n"
        "movb (%%esi), %%dl\n"  // 讀取字元 -> DL
        "testb %%dl, %%dl\n"    // 檢查結束符
        "je 2f\n"
        "cmpb $'0', %%dl\n"
        "jl 3f\n"
        "cmpb $'9', %%dl\n"
        "jg 3f\n"
        "movl $1, %%ecx\n"      // 讀到數字,狀態=1
        "jmp 4f\n"
        "3:\n"
        "cmpl $1, %%ecx\n"      // 狀態=1 才接受 'a'
        "jne 2f\n"
        "cmpb $'a', %%dl\n"
        "jne 2f\n"
        "movl $1, %%eax\n"      // 成功
        "jmp 2f\n"
        "4:\n"
        "incl %%esi\n"          // 下一字元
        "jmp 1b\n"
        "2:\n"
        "movl %%eax, %0\n"      // 回傳結果
        : "=r" (result)
        : "r" (s)
        : "%esi", "%eax", "%ecx", "%edx", "memory"
    );
    return result;
}

實務建議

  • 現代開發強烈不建議用內聯組語做字串解析:可讀性差、不可移植、難維護。
  • C 語言版本:
int is_digit_a(const char *s) {
    int n = 0;
    return (sscanf(s, "%da", &n) == 1) && s[strspn(s, "0123456789")] == 'a' && s[strspn(s, "0123456789")+1] == '\0';
}

或手寫迴圈,清晰且效能足夠。

總結

理解組語邏輯有助於底層除錯,但生產環境請使用高階語言標準庫或正則表達式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved