2013-05-01 14 views
9

के साथ स्ट्रिंग गिनती देता है, स्ट्रेल() स्ट्रिंग के अंत में शून्य टर्मिनेटर की गणना नहीं करता है। लेकिन, नीचे कोड नल टर्मिनेटर के साथ स्ट्रिंग गिनती प्रिंट करता है। क्या कोई मुझे बता सकता है क्यों? धन्यवादstrlen() सामान्य रूप से शून्य टर्मिनेटर

char str2[100]; 
printf("\nEnter a string: "); 
fgets (str2, sizeof(str2), stdin); 
printf("\n%d",strlen(str2)); 
+11

यह शायद गिनती है '\ n' बजाय' \ 0' –

+0

तो क्या स्ट्रिंग आप में प्रवेश किया था, और परिणाम क्या था? –

+0

[fgets() के संभावित डुप्लिकेट अंत में नई लाइन जोड़ता है] (http://stackoverflow.com/questions/13443793/fgets-adds-newline-at-the-end) –

उत्तर

34

मैं पूर्ववर्ती fgets शीघ्र संभालने हूँ newline चरित्र का चुनाव किया।

उदाहरण के लिए:

आप apple में डाल दिया।

आंतरिक रूप से आपकी स्ट्रिंग को apple\n\0 के रूप में संग्रहीत किया गया था।

strlen तो apple के लिए 6 लौटे + '\n'

+1

से अच्छा स्पष्टीकरण। एसओ में आपका स्वागत है! –

+1

धन्यवाद @luserdroog :) –

+0

@hmdb क्या आप इसे उत्तर के रूप में स्वीकार कर सकते हैं? – Gewure

0

fgets() पढ़ता है जब तक \n का सामना करना पड़ा है।

यदि उपयोगकर्ता anshul में प्रवेश करता है तो str2 में anshul\n\0 होगा।

strlen() 7 लौटाएगा क्योंकि strlen() खोज तब तक जब तक यह न्यूल ('0') चरित्र नहीं पाता है।

2

यहां आपने इनपुट लेने के लिए fgets() फ़ंक्शन का उपयोग किया है। जब आप fgets() फ़ंक्शन द्वारा इनपुट लेते हैं तो एक अतिरिक्त नया लाइन वर्ण ('\ n') आपके स्टिंग के साथ जोड़ा जाएगा। मान लीजिए आपका इनपुट है: "हैलो"। इस स्टिंग को टाइप करने के बाद आपको एंटर कुंजी दबाएं जिसके लिए आपकी स्ट्रिंग के साथ नया लाइन कैरेक्टर जोड़ा जाएगा। इसलिए ऐसा लगता है कि strlen() शून्य टर्मिनेटर की गणना करता है। लेकिन यदि आप scanf() फ़ंक्शन का उपयोग करके इनपुट लेते हैं तो यह एंटर दबाए जाने पर अतिरिक्त नया लाइन वर्ण ('\ n') नहीं जोड़ देगा। तो आप स्ट्रिंग वाले वर्ण की सटीक संख्या देखेंगे। मेरी व्याख्या देखने के लिए निम्न कोड चलाएं।

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

void main() 
{ 
char str2[100]; 
printf("\nEnter a string: "); 
scanf("%s",str2); 
//fgets (str2, sizeof(str2), stdin); 
printf("\n%d",strlen(str2)); 
} 
3

fgets() समारोह जब एक नई पंक्ति चरित्र (जब stdin का उपयोग कर कुंजी दर्ज करें) का सामना करना पड़ा है इनपुट स्वीकार करता है, और न्यू लाइन चरित्र \n समारोह द्वारा मान्य वर्ण माना जाता है और स्ट्रिंग अपने str2 में कॉपी किया में शामिल है। इसलिए जब आप इसे strlen() पर पैरामीटर के रूप में पास करते हैं तो यह अतिरिक्त \n वर्ण के लिए आपकी स्ट्रिंग में वर्णों की मूल संख्या से अधिक एक देता है।

आप वर्णों की मूल संख्या चाहते हैं या एक \ngets() फ़ंक्शन का उपयोग के रूप में यह नकल नहीं करता है न्यू लाइन आगे character.And, जोड़े जाने के लिए नहीं करना चाहते हैं, तो आप केवल तर्क के रूप में स्ट्रिंग पारित करने के लिए की जरूरत है gets() के लिए डिफ़ॉल्ट स्ट्रीम के रूप में stdin के लिए स्ट्रीम (stdin) पास करने की आवश्यकता नहीं है।

char str2[100]; 
printf("\nEnter a string: "); 
gets(str2); 
printf("\n%d",strlen(str2)); 
0

हो जाता है (रों) जब आप string.But, fgets (में प्रवेश किया जा रहा है के बाद दर्ज कुंजी हिट) '\ n' शामिल नहीं है एक फ़ाइल से पढ़ते समय '\ n' शामिल है।

प्रति आदमी पेज के रूप में (उपयोग: आदमी fgets) linux टर्मिनल पर,

fgets() सबसे एक बफर में धारा और उन्हें स्टोर से आकार वर्णों से कम पर में पढ़ता द्वारा की ओर इशारा किया। पढ़ना ईओएफ या न्यूलाइन के बाद बंद हो जाता है।यदि कोई नई लाइन पढ़ी जाती है, तो इसे बफर में संग्रहीत किया जाता है। एक समाप्ति शून्य बाइट ('\ 0') बफर में अंतिम चरित्र के बाद संग्रहीत किया जाता है।

0

जैसा कि दूसरों ने बताया है, fgets() newline (\ n) वर्ण पढ़ेगा और इसे आपके सरणी में संग्रहीत करेगा।

प्रत्येक कॉल के बाद fgets() मैं हमेशा strcspn() का उपयोग करता हूं ताकि न्यूलाइन कैरेक्टर को ढूंढने के लिए सरणी/पॉइंटर खोज सकें और इसे नल कैरेक्टर से बदल सकें।

char str2[100]; 
printf("\nEnter a string: "); 
fgets (str2, sizeof(str2), stdin); 

//new line of code to replace '\n' with '\0' 
str2[strcspn(str2, "\n")] = '\0'; 

printf("\n%d",strlen(str2)); 
संबंधित मुद्दे