मैं strcasecmpसी में फ़ंक्शन को फिर से लागू करने की कोशिश कर रहा हूं और मैंने देखा कि तुलनात्मक प्रक्रिया में एक असंगति प्रतीत होती है।
से man strcmp
Strcmp () फ़ंक्शन दो स्ट्रिंग्स s1 और s2 की तुलना करता है। लोकेल को ध्यान में नहीं रखा जाता है (स्थानीय-जागरूक तुलना के लिए, देखें स्ट्रैकोल (3))। यह s1 से कम, मिलान के लिए या s2 से अधिक होने के लिए क्रमशः एक पूर्णांक से कम, शून्य से अधिक या शून्य से अधिक रिटर्न देता है।
से man strcasecmp
Strcasecmp () फ़ंक्शन तार के s1 और s2 की बाइट-बाय-बाइट तुलना करता है, पात्रों के मामले की अनदेखी करता है। यह s1 से कम, मिलान के लिए या s2 से अधिक होने के लिए क्रमशः एक पूर्णांक से कम, शून्य से अधिक या शून्य से अधिक रिटर्न देता है।
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
यह जानकारी देते हुए, मुझे निम्नलिखित कोड के परिणाम की समझ नहीं है:
#include <stdio.h>
#include <string.h>
int main()
{
// ASCII values
// 'A' = 65
// '_' = 95
// 'a' = 97
printf("%i\n", strcmp("A", "_"));
printf("%i\n", strcmp("a", "_"));
printf("%i\n", strcasecmp("A", "_"));
printf("%i\n", strcasecmp("a", "_"));
return 0;
}
ouput:
-1 # "A" is less than "_"
1 # "a" is more than "_"
2 # "A" is more than "_" with strcasecmp ???
2 # "a" is more than "_" with strcasecmp
ऐसा प्रतीत होता है कि, यदि वर्तमान वर्ण s1एक अक्षर है, तो इसे हमेशा निचले हिस्से में बदल दिया जाता है, भले ही वर्तमान वर्ण में s2कोई अक्षर हो या न हो।
क्या कोई इस व्यवहार की व्याख्या कर सकता है? क्या पहली और तीसरी पंक्ति एक जैसी नहीं होनी चाहिए?
आपका अग्रिम में ही बहुत धन्यवाद!
पुनश्च:
मैं gcc 9.2.0मंजरो पर उपयोग कर रहा हूं।
इसके अलावा, जब मैं -fno-builtinझंडे के साथ संकलित करता हूं तो मुझे इसके बजाय मिलता है:
-30
2
2
2
मुझे लगता है कि यह है क्योंकि कार्यक्रम gcc के अनुकूलित कार्यों का उपयोग नहीं करता है, लेकिन सवाल बना हुआ है।
strcasecmpआप जिस संदर्भ का उल्लेख कर रहे हैं, वह सटीक नहीं है। उत्कीर्ण उत्तरों में अधिक विवरण।
A < _ && a > _ && A == aबहुत सारी समस्याएं पैदा करेगा।
unsigned char। C17 / 18 "स्ट्रिंग हैंडलिंग <string.h>" -> "इस उपखंड में सभी कार्यों के लिए, प्रत्येक वर्ण की व्याख्या की जाएगी जैसे कि उसका प्रकार था unsigned char"। एक बार charASCII रेंज 0-127 के बाहर मानों पर फर्क पड़ता है।
printf("%i\n", strcasecmp("a", "_"));यह शायद के रूप में एक ही परिणाम होना चाहिएprintf("%i\n", strcasecmp("A", "_"));लेकिन इसका अर्थ यह है कि एक इन दो केस-संवेदी कॉल के अपने केस-संवेदी समकक्ष के साथ सहमत नहीं हो रहा है।