इस ट्यूटोरियल में, आप C प्रोग्रामिंग में स्ट्रिंग्स के बारे में जानेंगे। आप उदाहरणों की सहायता से उन्हें घोषित करना, उन्हें प्रारंभ करना और विभिन्न I/O संचालन के लिए उनका उपयोग करना सीखेंगे।
सी प्रोग्रामिंग में स्ट्रिंग क्या हैं?
सी प्रोग्रामिंग में, एक स्ट्रिंग एक null कैरेक्टर \ 0 के साथ समाप्त वर्णों का एक क्रम है। सी प्रोग्रामिंग में स्ट्रिंग को कैरेक्टर्स की एक Array के रूप में परिभाषित किया गया है। एक कैरेक्टर Array और एक स्ट्रिंग के बीच का अंतर यह है कि स्ट्रिंग को एक विशेष वर्ण या कैरेक्टर '\0' के साथ समाप्त किया जाता है।
उदाहरण के लिए:
char c[] = "c string";
जब कंपाइलर दोहरे उद्धरण चिह्नों में संलग्न वर्णों के अनुक्रम का सामना करता है, तो डिफ़ॉल्ट रूप से अंत में एक null कैरेक्टर \0 जोड़ता है।
एक स्ट्रिंग घोषित करने के लिए बेसिक सिंटैक्स
एक स्ट्रिंग घोषित करना एक-आयामी Array घोषित करने जितना आसान है। नीचे एक स्ट्रिंग घोषित करने के लिए मूल सिंटैक्स बताया गया है।
char str_name[size];
उपरोक्त सिंटैक्स में str_name स्ट्रिंग वेरिएबल को दिया गया कोई भी नाम है और स्ट्रिंग की लंबाई को परिभाषित करने के लिए size का उपयोग किया जाता है, यानी कैरेक्टर्स की संख्या स्ट्रिंग में स्टोर होगी।
📝नोट: कृपया ध्यान रखें कि एक अतिरिक्त टर्मिनेटिंग कैरेक्टर है जो null कैरेक्टर ('\0') है जो स्ट्रिंग की समाप्ति को इंगित करने के लिए प्रयोग किया जाता है जो सामान्य कैरेक्टर Array से स्ट्रिंग्स को अलग करता है।
एक स्ट्रिंग कैसे घोषित करें?
यहां निचे उदाहरण में बताया गया है कि आप एक स्ट्रिंग कैसे घोषित कर सकते हैं;
उदाहरण के लिए:
char s[5];
यहां, हमने 5 वर्णों या कैरेक्टर की एक स्ट्रिंग घोषित की है।
स्ट्रिंग घोषणा के तरीके
सी भाषा में एक स्ट्रिंग घोषित करने के दो तरीके हैं।
char array द्वारा
string literal द्वारा
01. आइए सी भाषा में char array द्वारा स्ट्रिंग घोषित करने का उदाहरण देखें।
char ch[8] = {'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', '\0'};
जैसा कि हम जानते हैं, ऐरे इंडेक्स 0 से शुरू होता है, इसलिए इसे नीचे दिए गए चित्र में दर्शाया जाएगा।
स्ट्रिंग घोषित करते समय, आकार अनिवार्य नहीं है। तो हम ऊपर दिए गए कोड को नीचे दिए अनुसार लिख सकते हैं;
char ch[] = {'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', '\0'};
02. हम स्ट्रिंग को सी भाषा में string literal द्वारा भी परिभाषित कर सकते हैं। उदाहरण के लिए:
char ch[] = "CreativeBloke";
ऐसी स्थिति में, कंपाइलर द्वारा स्ट्रिंग के अंत में null कैरेक्टर '\0' जोड़ा जाएगा।
char array और string literal के बीच अंतर
char array और string literal के बीच दो मुख्य अंतर हैं।
हमें अपने आप से array के अंत में null कैरेक्टर '\0' जोड़ने की आवश्यकता है, जबकि यह कैरेक्टर array के मामले में संकलक द्वारा आंतरिक रूप से जोड़ा जाता है।
string literal को कैरेक्टर्स के दूसरे सेट पर पुन: असाइन नहीं किया जा सकता है, जबकि हम array के कैरेक्टर्स को पुन: असाइन कर सकते हैं।
स्ट्रिंग्स को इनिशियलाइज़ कैसे करें?
आप कई तरीकों से स्ट्रिंग्स को इनिशियलाइज़ या आरंभीकरण कर सकते हैं।इसे हम एक उदाहरण की मदद से समझाएंगे।
char c[] = "abcd";
char c[50] = "abcd";
char c[] = {'a', 'b', 'c', 'd', '\0'};
char c[5] = {'a', 'b', 'c', 'd', '\0'};
आइए एक और उदाहरण लें;
char c[5] = "abcde";
यहां, हम 5 वर्णों या कैरेक्टर वाले char सरणी यानि कि Array में 6 वर्ण ( अंतिम वर्ण '\0' ) निर्दिष्ट करने का प्रयास कर रहे हैं। यह बुरा है और आपको ऐसा कभी नहीं करना चाहिए।
स्ट्रिंग्स को मान असाइन करना
सी में एरेज़ और स्ट्रिंग्स द्वितीय श्रेणी के नागरिक ( Second-Class Citizens ) हैं।एक बार घोषित होने के बाद वे असाइनमेंट ऑपरेटर का समर्थन नहीं करते हैं।
उदाहरण के लिए:
char c[100];
c = "C programming"; // Error! array type is not assignable.
📝नोट: इसके बजाय स्ट्रिंग को कॉपी करने के लिए strcpy( ) फ़ंक्शन का उपयोग करें।
उपयोगकर्ता से स्ट्रिंग पढ़ें
आप एक स्ट्रिंग को पढ़ने के लिए scanf( ) फ़ंक्शन का उपयोग कर सकते हैं।
scanf( ) फ़ंक्शन वर्णों या कैरेक्टर के अनुक्रम को तब तक पढ़ता है जब तक कि उसका सामना व्हाइटस्पेस ( स्पेस, न्यूलाइन, टैब, आदि ) से नहीं हो जाता।
उदाहरण: 01. | एक स्ट्रिंग पढ़ने के लिए scanf( )
#include <stdio.h>
int main()
{
char name[20];
printf("Enter your name: ");
scanf("%s", name);
printf("Your name is %s.", name);
return 0;
}
इस प्रोग्राम का आउटपुट है;
Enter your name: Romeyo Boy
Your name is Romeyo.
भले ही Romeyo Boy को उपरोक्त प्रोग्राम में दर्ज किया गया था, केवल "Romeyo" नाम स्ट्रिंग में संग्रहीत किया गया था। ऐसा इसलिए है, क्योंकि Romeyo के बाद एक जगह या स्पेस थी।
यह भी ध्यान दें कि हमने scanf( ) के साथ पर &name के बजाय कोड नाम का उपयोग किया है, मतलब कि %s का।
scanf("%s", name);
ऐसा इसलिए है, क्योंकि नाम एक char array है, और हम जानते हैं कि array नाम सी में पॉइंटर्स के लिए क्षय यानि कि नष्ट ( Decay ) हो जाते हैं।
इस प्रकार, scanf( ) में नाम पहले से ही स्ट्रिंग में पहले तत्व के पते को इंगित करता है, यही कारण है कि हमें & का उपयोग करने की आवश्यकता नहीं है।
टेक्स्ट की एक पंक्ति कैसे पढ़ें?
आप स्ट्रिंग की एक पंक्ति या टेक्स्ट को पढ़ने के लिए fgets( ) फ़ंक्शन का उपयोग कर सकते हैं। और आप स्ट्रिंग प्रदर्शित करने के लिए put( ) फ़ंक्शन का उपयोग कर सकते हैं।
उदाहरण: 02. | fgets( ) और put( )
#include <stdio.h>
int main()
{
char name[30];
printf("Enter your name: ");
fgets(name, sizeof(name), stdlin); // read string
printf("Your name is: ");
puts(name); // display string
return 0;
}
इस प्रोग्राम का आउटपुट है;
Enter your name: Mohit Sharma
Your name is: Mohit Sharma
यहां, हमने उपयोगकर्ता से एक स्ट्रिंग को पढ़ने के लिए fgets( ) फ़ंक्शन का उपयोग किया है।
fgets(name, sizeof(name), stdlin); // read string
sizeof( name ) का परिणाम 30 होता है। इसलिए, हम इनपुट के रूप में अधिकतम 30 वर्ण ले सकते हैं जो नाम स्ट्रिंग का आकार है।
स्ट्रिंग को प्रिंट करने के लिए, हमने put(name); का उपयोग किया है।
⚡ नोट: gets( ) फ़ंक्शन उपयोगकर्ता से इनपुट लेने के लिए भी हो सकता है। हालाँकि, इसे C मानक से हटा दिया गया है। ऐसा इसलिए है, क्योंकि हो gets( ) आपको किसी भी लम्बाई के कैरेक्टर्स को इनपुट करने की अनुमति देता है। इसलिए, एक बफर ओवरफ्लो हो सकता है।
फ़ंक्शन के लिए स्ट्रिंग पास करना
स्ट्रिंग्स को किसी फ़ंक्शन में उसी तरह से पास किया जा सकता है, जैसे कि Arrays।
उदाहरण: 03. | किसी फंक्शन में स्ट्रिंग पास करना
#include <stdio.h>
void displayString(char str[]);
int main()
{
char str[50];
printf("Enter string: ");
fgets(str, sizeof(str), stdin);
displayString(str); // Passing string to a function.
return 0;
}
void displayString(char str[])
{
printf("String Output: ");
puts(str);
}
स्ट्रिंग्स और पॉइंटर्स
Arrays की तरह, स्ट्रिंग नाम पॉइंटर्स के लिए "क्षय"( Delayed ) होते हैं। इसलिए, आप स्ट्रिंग के तत्वों में हेरफेर करने के लिए पॉइंटर्स का उपयोग कर सकते हैं। हम अनुशंसा करते हैं कि आप इस उदाहरण की जाँच करने से पहले C Arrays और Pointers की जाँच करें।
उदाहरण: 04. | स्ट्रिंग्स और पॉइंटर्स
#include <stdio.h>
int main(void)
{
char name[] = "Harry Potter";
printf("%c", *name); // Output: H
printf("%c", *(name+1)); // Output: a
printf("%c", *(name+7)); // Output: o
char *namePtr;
namePtr = name;
printf("%c", *namePtr); // Output: H
printf("%c", *(namePtr+1)); // Output: a
printf("%c", *(namePtr+7)); // Output: o
}
आमतौर पर प्रयुक्त स्ट्रिंग फ़ंक्शंस :-
strlen( ) - एक स्ट्रिंग की लंबाई की गणना करता है।
strcpy( ) - एक स्ट्रिंग को दूसरे में कॉपी करता है।
strcmp ( ) - दो स्ट्रिंग की तुलना करता है।
strcat ( ) - दो स्ट्रिंग को जोड़ता है।
ट्रैवर्सिंग स्ट्रिंग
किसी भी प्रोग्रामिंग भाषा में स्ट्रिंग को ट्रैवर्स करना सबसे महत्वपूर्ण पहलुओं में से एक है। हमें एक बहुत बड़े टेक्स्ट में हेरफेर करने की आवश्यकता हो सकती है, जो टेक्स्ट को ट्रैवर्सिंग करके किया जा सकता है।
ट्रैवर्सिंग स्ट्रिंग एक integer array को ट्रैवर्स करने से कुछ अलग है। हमें एक integer array को ट्रैवर्स करने के लिए array की लंबाई जानने की आवश्यकता है, जबकि हम स्ट्रिंग के मामले में स्ट्रिंग के अंत की पहचान करने और लूप को समाप्त करने के लिए null कैरेक्टर का उपयोग कर सकते हैं।
इसलिए, एक स्ट्रिंग को ट्रैवर्स करने के दो तरीके हैं।
स्ट्रिंग की लंबाई यानि length का उपयोग करके
null कैरेक्टर का उपयोग करके।
आइए उनमें से प्रत्येक पर चर्चा करें।
स्ट्रिंग की लंबाई ( length ) का उपयोग करना
उदाहरण: 05. | आइए एक स्ट्रिंग में स्वरों की संख्या गिनने का एक उदाहरण देखें।
#include <stdio.h>
void main ()
{
char s[11] = "CreativeBloke";
int i = 0;
int count = 0;
while(i<11)
{
if(s[i]=='a'|| s[i] == 'e'|| s[i] == 'i'|| s[i] == 'u'|| s[i] ==
'o')
{
count ++;
}
i++;
}
printf("The number of vowels is: %d", count);
}
इस प्रोग्राम का आउटपुट है;
The number of vowels is: 6
null कैरेक्टर उपयोग करना
आइए null कैरेक्टर का उपयोग करके स्वरों की संख्या गिनने का वही उदाहरण देखें।
उदाहरण: 06.
#include <stdio.h>
void main()
{
char s[11] = "CreativeBloke";
int i = 0;
int count = 0;
while(s[i] != NULL)
{
if(s[i]=='a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'u' || s[i] == 'o')
{
count ++;
}
i++;
}
printf("The number of vowels is: %d", count);
}
इस प्रोग्राम का आउटपुट है;
The number of vowels is: 6
स्ट्रिंग को इनपुट के रूप में स्वीकार करना
अब तक, हमने उपयोगकर्ता से इनपुट स्वीकार करने के लिए स्कैनफ का उपयोग किया है। हालाँकि, इसका उपयोग स्ट्रिंग्स के मामले में भी किया जा सकता है लेकिन एक अलग परिदृश्य के साथ। नीचे दिए गए कोड पर विचार करें जो स्पेस का सामना करते समय स्ट्रिंग को संग्रहीत करता है।
उदाहरण: 07.
#include <stdio.h>
void main()
{
char s[20];
printf("Enter the string? ");
scanf("%s", s);
printf("You entered %s", s);
}
इस प्रोग्राम का आउटपुट है;
Enter the string? enjoying reading c programming
You entered enjoying
आउटपुट से यह स्पष्ट है कि, उपरोक्त कोड स्पेस सेपरेटेड स्ट्रिंग्स के लिए काम नहीं करेगा। इस कोड को स्पेस सेपरेटेड स्ट्रिंग्स के लिए काम करने के लिए, स्कैनफ फ़ंक्शन में आवश्यक मामूली परिवर्तन, यानी स्कैनफ ("% s", s) लिखने के बजाय, हमें लिखना होगा: स्कैनफ ("% [^ \ n] s" ,s) जो नई लाइन (\n) के सामने आने पर कंपाइलर को स्ट्रिंग s को स्टोर करने का निर्देश देता है। आइए स्पेस-सेपरेटेड स्ट्रिंग्स को स्टोर करने के लिए निम्नलिखित उदाहरण पर विचार करें।
उदाहरण: 08.
#include <stdio.h>
void main()
{
char s[20];
printf("Enter the string?: ");
scanf("%[^\n]s", s);
printf("You are entered: %s", s);
}
इस प्रोग्राम का आउटपुट है;
Enter the string?: Creative Bloke - Creative Knowledges
You are entered: Creative Bloke - Creative Knowledges
यहां हमें यह भी ध्यान देना चाहिए कि हमें एक स्ट्रिंग को स्टोर करने के लिए स्कैनफ में (&) ऑपरेटर के पते का उपयोग करने की आवश्यकता नहीं है क्योंकि स्ट्रिंग s वर्णों की एक array है और array का नाम, अर्थात, स्ट्रिंग के आधार पते को इंगित करता है ( कैरेक्टर array ) इसलिए हमें इसके साथ & का उपयोग करने की आवश्यकता नहीं है।
कुछ महत्वपूर्ण बिंदु :
हालाँकि, निम्नलिखित बिंदु हैं जिन पर स्कैनफ का उपयोग करके स्ट्रिंग्स में प्रवेश करते समय ध्यान दिया जाना चाहिए।
कंपाइलर कैरेक्टर ऐरे पर बाउंड चेकिंग नहीं करता है। इसलिए, ऐसा मामला हो सकता है जहां स्ट्रिंग की लंबाई कैरेक्टर array के आयाम से अधिक हो सकती है जो हमेशा कुछ महत्वपूर्ण डेटा को अधिलेखित कर सकती है।
scanf( ) का उपयोग करने के बजाय, हम gets( ) का उपयोग कर सकते हैं जो एक हेडर फ़ाइल string.h में परिभाषित एक इनबिल्ट फ़ंक्शन है। gets( ) एक समय में केवल एक स्ट्रिंग प्राप्त करने में सक्षम है।
Comments