在使用stlen()函式時遇到的執行異常問題

2021-09-25 15:27:40 字數 836 閱讀 9895

今天寫了乙個kmp演算法,但是在使用strlen()函式獲取字串長度時,發現程式和預期不對,無論怎樣除錯結果依舊如此。因此我就找到了strlen()函式的定義,如下**:

size_t __cdecl strlen(

_in_z_ char const* _str

);

可以看出來函式返回為size_t型別,再來看看他在c語言中的定義,為unsigned int型別,無符號整形。

typedef unsigned int     size_t;
再來看看我的**:

int kmp(char *s, char * p,int *next)

else

j = next[j];

} if (j == strlen(p))

return i-j;

else

return -1;

}

由於使用kmp演算法,為了方便寫程式next陣列的第一位值為-1,小於零,所以在程式執行的過程中存在j的值為-1的情況,在執行while語句時

while (i < strlen(s) && j < strlen(p))
會出現-1和strlen()函式作比較的情況,在這種情況下-1會被強制轉化成unsigned int型資料,(unsigned int)-1 =4294967295,是乙個大於0的數。會出現while()語句不執行的情況,所以就出現了無論怎樣除錯都無法達到預期效果的情況。

解決這個問題的方法很簡單,只需要定義兩個int型變數,現將字串的長度儲存起來,在進行比較就可以了。

C語言 使用函式時遇到的問題

函式是一段 塊,由 返回型別 函式名 函式引數 構成。定義函式有兩種方式。一種是宣告與函式體放在一起,另一種是在main函式之前進行宣告,把函式塊放在 最後。我們通常使用後者 如下所示 include intfunction int a,int b int main intfunction int ...

在使用vue 全域性filter時遇到的問題

param statusnum export function userstatusfilter statusnum case 2 return userstatus 一直不生效,顯示空白.後來通過增加default選項,確定了過濾器是生效的.那就是函式內條件的格式問題,給case後面的數字加上冒號...

使用ToluaFrameWork時遇到的一些問題

最近的專案在使用tolua框架熱更新。在做初期準備時,拿著github上的toluaframework進行學習和修改,在匯出安卓包時,遇到了一些問題,因此記錄了一下。1.plugins目錄下的x86和x86 64資料夾中的tolua要設定成不同的平台,android libs的armeabi v7a...