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

C 語言中 strlen 返回值為無符號數導致 -1 比較異常

     編輯:程式設計綜合問答

現象

#include <stdio.h>
#include <string.h>
int main() {
  char s[100];
  scanf("%s", s);
  if (-1 >= strlen(s)) printf("true\n");
  return 0;
}

輸入任意字符串,竟輸出 "true"。

原因

strlen 返回類型為 size_t,在多數編譯器中定義為 unsigned int 或 unsigned long。表達式 -1 >= strlen(s) 中,-1 會被隱式轉換為無符號數(極大值 0xFFFFFFFF / 0xFFFFFFFFFFFFFFFF),導致條件恒為真。

正確寫法

// 方案一:顯式轉換為有符號數
if ((int)strlen(s) <= -1) ... // 但 strlen 非負,此判斷無意義

// 方案二:避免與負數比較
if (strlen(s) == 0) ... // 判斷空字符串

// 方案三:使用 int 變量接收
int len = (int)strlen(s);
if (len < 0) ... // 永不成立

教訓

  • 標準庫函數返回無符號類型時,避免與有符號負數直接比較。
  • 啟用編譯器警告(-Wsign-compare)可提前發現此類問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved