我們經常需要去除字符串里的開始符 號或者結束符號。
本茲介紹的程序,芯片破解使用的字符串剪切 專門用千去除字符串的結尾部分的回車和換行字符 CR/LF。
!include <s t di o . h> #include <s t r i ng , h>
char* str_trim !char *s)
I
char c;
size_t str_len;
// work as long as r or n is at the end of string
// stop if some other character there or its an empty string'
// (at start or dueto ouroperation)
for (str_len=strlen (s); str_len>O && (c=s [s t r_l e n- 1} ) ; str_len--)
(
if (c= ' r ' 11 c ==' n ' )
s[str_len-1}=0;
else
};
break;
returns;
};
int main ()
{
// test
// strdup() is used to copy text string into data segme nt ,
// because it will crash on Linux ot her wi s e ,
// where text strings are allocated in constant data segme nt ,
// and not modifiable.
printf ( " [ %s ] n " , str_trim (s t r dup ( " " ) ) ) ;
printf ( " [%s] n" , str_trim (s rt dup ( " n" ) ) ) ;
printf ( " [%s] n" , str_trim (strdup("r")));
printf ( " [%s ] n " , str_trim (s t r dup ( " n r " ) ) ) ;
printf ( " [%s ] n" , str_trim (s t r dup ( " r n" ) ) ) ;
printf ( " [%s] n" , str_trim (s rt dup ( " t es t l r n" ) ) ) ;
printf ( " [%s] n" , str_trim (strdup ( " t es t 2 n r " ) ) ) ; printf ( " [%s ] n " , str_trim (s t r du p ( " t es t 3 n r n r " ) ) ) ; printf ( " [%s ] n" , str_trim (s t r dup ( " t es t 4 n" ) ) ) ;
printf ( " [%s] n" , str_trim (s t r d up ( " t es t S r " ) ) ) ; printf ( " [%s] n" , str_trim (strdup ( " t es t 6 r r r " ) ) ) ;
};
輸入參數總能正常返回并退出。當你需要對串進行批蜇處理時會非常方便, 就像這里的 ma in()函數一樣。
在該程序循環體的 fo r() 語句里有兩個判斷條件表達式: 一個條件表達式是 str_ le n> O ( 字符串的長度大千零); 另外一個是 c=s [str _ le n- 1] ( 意 思是取出的值不為 0、不是終止符 )。循環判斷語句 " str _ le n > O && (c =s [ str _ le n- 1]) " 實際上利用了所謂“邏輯短路”的 執行特性, 因此可以這樣書寫第二個判斷表達式(可以參考 Yur l 3 :p. l.3 .8 ) 。CIC丑編譯器自左至右的逐一檢測判斷條件。因為邏輯操作符是 " & & " (與),所以
一旦第一個條件表達式的值為假, 計算機就不用再判斷(執行)第二個條件判斷表達式。實際上, 第二個條件表達式是一種只能在相應的條件下才可以運行的語句。筆者綜合利用了第一個條件表達式、邏輯操作符"&&"的邏輯含義以及“邏輯短路” 的特性, 為第二個條件判斷表達式限定了執行條件。