2015-06-09 19 views
3

是否在C99中刪除了功能stricmp()strnicmp()? 當我嘗試對C99進行編譯時,我總是得到警告函數的隱式聲明stricmp()(還有strnicmp())。例如,下面的簡單代碼會讓我發出警告。C99刪除stricmp()和strnicmp()?

#include<string.h> 
#include<stdio.h> 

char arr[100]="hello"; 
char arr2[100]="hEllo"; 

int main() 
{ 
    int n=-1; 
    printf("%d\n",n); 
    n=strnicmp(arr,arr2,3); // the same when use the function stricmp(); 
    printf("%d\n",n); 

    getchar(); 
    return 0; 
} 

當我嘗試編譯這段代碼對C99(gcc -Wall -std=c99 main.c -o main),我得到的警告。但是,如果我在沒有-std=c99的情況下編譯它,則不會引發警告。 但是,即使存在隱式聲明的警告,我的代碼仍然正常工作。

這是爲什麼?這是一個錯誤?如果不是bug,那麼發生這種警告的C99的變化究竟是什麼?

+0

嘗試'-std = gnu99' –

+4

這些函數在C標準中有*從未*,事實上在C標準中沒有不區分大小寫的字符串比較函數。 'stricmp','strcasecmp'等函數全部由其他標準擴展或定義(POSIX,WIndows等) –

+0

請參見[g ++錯誤:'stricmp'未在此範圍內聲明(但對於'strcmp'確定) ](http://stackoverflow.com/q/1784767/1708801) –

回答

6

當代碼與C99編譯時,它符合C99標準,它沒有stricmp()。當代碼編譯沒有C99開關時,它符合實現stricmp()的未知標準。 (鑑於gcc而不-std=c99,可能編譯到C89/90標準wihich允許隱式聲明。)

@Joachim Pileborg作爲評論,比較不敏感不是C標準的一部分。

使用C99隱式函數需要診斷(在這種情況下爲警告)。沒有C99,函數的隱式使用不會產生警告。這個函數存在於這個編譯器的庫中 - 這只是函數在使用之前聲明的一個問題。

易足以讓你自己:

int wal_stricmp(const char *a, const char *b) { 
    int ca, cb; 
    do { 
    ca = (unsigned char) *a++; 
    cb = (unsigned char) *b++; 
    ca = tolower(toupper(ca)); 
    cb = tolower(toupper(cb)); 
    } while (ca == cb && ca != '\0'); 
    return ca - cb; 
} 

注:當編碼,並試圖讓A-Z比賽a-z,不區分大小寫字符串比較例程往往工作良好均勻。但是當試圖以的順序字符串時,事情很快就會失去控制。 「abc」與「_bc」可以在另一個之前或之後出現,具體取決於慈善行爲是大寫還是小寫。在ASCII中,大寫和小寫字母之間存在'_'。隨着國際化和地區問題,情況變得更加複雜。我的代碼示例使用轉換的往返行程來處理大寫字母char沒有與小寫字母1對1映射的問題。 IMO強大的不區分大小寫比較的複雜性要求使用UTF編碼及其案例定義。

+0

對於輕微的表現收益:'ca = * a;一個++; if(islower(ca)){ca = toupper(ca); ''等等。爲您節省一些額外的支票。 – Lundin

+0

對不起,我不能完全理解你爲什麼在你的函數中使用「toupper()」和「tolower()」,雖然它工作得很好 – walkerlala

+0

@walkerlala'toupper()'是一個標準的C函數, 「int」與大寫字母等效。 A',A',A',A','0','''0' 'unsigned char'和'EOF'。根據_locale_,你也可以得到'''''''''''''''tolower()'是小寫字母的等值。 – chux

1

stricmpstrincmp都是非標準功能。它們從未成爲C標準的一部分。

+0

如果它不是c標準的一部分,那麼爲什麼我只能得到警告,而不是錯誤? – walkerlala

+0

我的意思是,既然這個警告是隱式聲明,而不是錯誤,那麼這個函數確實是以某種異常的方式聲明的,對吧? – walkerlala

+1

@walkerlala:因爲GCC人員決定做出(或離開)函數的隱式聲明是一個警告而不是錯誤。使用'-pedantic-errors'或者更具體的'-Werror = implicit-function-declaration'。 – cremno