मैं 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
"। एक बार char
ASCII रेंज 0-127 के बाहर मानों पर फर्क पड़ता है।
printf("%i\n", strcasecmp("a", "_"));
यह शायद के रूप में एक ही परिणाम होना चाहिएprintf("%i\n", strcasecmp("A", "_"));
लेकिन इसका अर्थ यह है कि एक इन दो केस-संवेदी कॉल के अपने केस-संवेदी समकक्ष के साथ सहमत नहीं हो रहा है।