首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 標準庫函數詳解:strncmp — 區分大小寫比較字串前 N 個字元

     編輯:關於C語言

函數原型

#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);

功能描述

按字典序(基於字元 ASCII/編碼值)比較字串 s1 和 s2 的前 n 個字元。**區分大小寫**。若在比較 n 字元前遇到任一字串結束符 \\0,則提前停止比較。

參數與返回值

  • 參數:s1, s2 為待比較字串;n 為最大比較字元數。
  • 返回值:
    • < 0:s1 小於 s2。
    • = 0:前 n 字元相等(或均提前遇到 \\0)。
    • > 0:s1 大於 s2。

範例程式碼

// strncmp_demo.c
#include <stdio.h>
#include <string.h>

int main(void) {
    const char *s1 = "Hello, Programmers!";
    const char *s2 = "Hello, programmers!"; // 差異在 'P' (80) vs 'p' (112)
    int r;

    // 1. 比較前 6 字元 "Hello," -> 相同
    r = strncmp(s1, s2, 6);
    printf("比較前 6: %d (預期 0)\n", r);

    // 2. 比較前 10 字元 "Hello, Pro" vs "Hello, pro" -> 'P' vs 'p' 差異
    r = strncmp(s1, s2, 10);
    printf("比較前 10: %d (預期負數, 'P' < 'p')\n", r);

    // 3. 比較 "abc" vs "abcdef" 前 5 字元 -> s1 結束,s1 < s2
    r = strncmp("abc", "abcdef", 5);
    printf("'abc' vs 'abcdef' 前5: %d (負數)\n", r);

    // 4. 與 strcmp 差異:strcmp 比較到 \\0 結束;strncmp 限制長度
    printf("strcmp: %d\n", strcmp(s1, s2));
    printf("strncmp (len=20): %d\n", strncmp(s1, s2, 20));

    return 0;
}

執行結果

比較前 6: 0 (預期 0)
比較前 10: -32 (預期負數, 'P' < 'p')
'abc' vs 'abcdef' 前5: -100 (負數, '\\0' < 'd')
strcmp: -32
strncmp (len=20): -32

核心應用場景

  1. 固定長度協議解析:網路封包、二進制檔案頭部、固定寬度欄位(如舊式資料庫記錄)的關鍵字匹配。
  2. 前綴匹配:檢查字串是否以特定前綴開頭(如 strncmp(str, "HTTP/", 5) == 0)。
  3. 排序比較函數:qsort 或 bsearch 的比較回調中,僅比較關鍵字前綴。
  4. 安全比較:避免比較超出緩衝區範圍(配合已知長度使用)。

注意事項

  • 返回值大小無意義:標準僅保證符號(正/負/零),具體數值視實現而定(通常為首對差異字元的差值)。**不可**假設返回值為 -1, 0, 1。
  • n = 0:直接返回 0,不存取記憶體(安全)。
  • 簽名字元陷阱:char 是否有號視編譯器而定。比較非 ASCII 字元(>127)時,建議轉為 unsigned char 比較或使用 memcmp。

相關函數對比

函數比較範圍大小寫停止條件
strcmp整個字串敏感遇 \\0
strncmp前 n 字元敏感遇 \\0 或 n 字元
strnicmp前 n 字元不敏感遇 \\0 或 n 字元
memcmp前 n 位元組二進制固定 n 位元組
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved