के साथ पढ़ने वाली रेखा पर strcmp मैं दो तारों की तुलना करने की कोशिश कर रहा हूं। एक फ़ाइल में संग्रहीत, दूसरा उपयोगकर्ता (stdin) से पुनर्प्राप्त।fgets
यहां एक नमूना कार्यक्रम है:
int main()
{
char targetName[50];
fgets(targetName,50,stdin);
char aName[] = "bob";
printf("%d",strcmp(aName,targetName));
return 0;
}
इस कार्यक्रम में, strcmp
-1 मान लौटाता है जब इनपुट "bob"
है। यह क्यों है? मैंने सोचा कि वे बराबर होना चाहिए। मैं इसे कैसे प्राप्त कर सकता हूं ताकि वे हैं?
आपको 'strcmp' का उपयोग करने से बचना चाहिए। इसके बजाए 'strncmp' का प्रयोग करें, खासकर यदि आप निश्चित-चौड़ाई वाली स्ट्रिंग के विरुद्ध तुलना कर रहे हैं। 'Strncmp (aName, targetName, strlen (aName)) का उपयोग करना आपके लिए यहां काम करना चाहिए। – bta
बीटीए की टिप्पणी सिर्फ गलत है - अगर आप पूरी स्ट्रिंग के बजाय उपसर्ग के खिलाफ जांचना चाहते हैं तो strncmp का उपयोग करें, उदाहरण के लिए। "बॉबकैट" भी मेल खाएगा। –
मैंने कहा कि क्योंकि 'strcmp' एक पूर्ण टर्मिनेटर तक पहुंचने तक या स्ट्रिंग अलग होने तक तुलना करना जारी रखेगा। यदि आप निश्चित नहीं हो सकते हैं कि आपके तार हमेशा ठीक से समाप्त हो जाएंगे, तो 'strcmp' बफर ओवरफ़्लो और मेमोरी एक्सेस उल्लंघनों को पेश कर सकता है। 'strncmp' सिर्फ उपसर्ग पढ़ने के लिए नहीं है; यह सुनिश्चित करने के लिए कि आप अपनी सरणी सीमाओं को बहती नहीं हैं, अपने निश्चित-लंबाई बफर के आकार में अंतिम पैरामीटर सेट करें। – bta