मैं सी में एक स्ट्रिंग कैसे कम कर सकता हूं?


108

मैं मिश्रित केस स्ट्रिंग को C में लोअरकेस स्ट्रिंग में कैसे बदल सकता हूं?


2
क्या आप सिर्फ ASCII के साथ पत्र az के साथ काम कर रहे हैं?
मार्क बायर्स

1
ascii। मैं इसे कैसे ध्यान में रखूंगा? नीचे दिए गए उदाहरण अभी भी काम करेंगे? यदि मेरा चार्ट '#' हो और टोलवर () उस पर कॉल किया जाए तो क्या होगा?
टोनी स्टार्क

1
वह काम करेगा। मैं ज्यादा सोच रहा था कि क्या आपके तार में more या your जैसी चीजें हैं।
मार्क बायर्स

1
सिर्फ "स्ट्रगलर" का उपयोग क्यों न करें? strlwr((char*)str);यह सिर्फ स्ट्रिंग के माध्यम से जाता है और इसे स्वयं में परिवर्तित करता है।
लैरी

1
@ लॉरी यह गैर-मानक है।
मध्य

जवाबों:


153

यह मानक पुस्तकालय में है, और यह सबसे सीधा तरीका है जो मैं इस तरह के फ़ंक्शन को लागू करने के लिए देख सकता हूं। तो हाँ, स्ट्रिंग के माध्यम से लूप करें और प्रत्येक वर्ण को लोअरकेस में बदलें।

कुछ इस तरह तुच्छ:

#include <ctype.h>

for(int i = 0; str[i]; i++){
  str[i] = tolower(str[i]);
}

या यदि आप एक लाइनर पसंद करते हैं, तो आप जेएफ सेबेस्टियन द्वारा इस का उपयोग कर सकते हैं:

for ( ; *p; ++p) *p = tolower(*p);

35
for ( ; *p; ++p) *p = tolower(*p);अधिक मुहावरेदार लगता है।
9

14
@ जेएफ तुम वहाँ जाओ। निर्भर करता है कि वे कोड को डरावना या अच्छा देखना चाहते हैं :) (बहुत पठनीय एक लाइनर, लेकिन यह डरावना दिखता है)
अर्लज़

यह मुझे एक segfault देता है अगर str एक है char *, लेकिन अगर str एक char अरेंजमेंट नहीं है। उसके लिए कोई स्पष्टीकरण मिला?
इलेक्ट्रिक कॉफी

1
मेरा मानना ​​है कि एक लाइनर आपको अपने पॉइंटर को स्ट्रिंग में खो देगा।
ऐस। सी। पी।

2
मेरा मानना ​​है कि एक लाइनर में अनकहा प्रभाव होगा।
NOP दा कॉल

7

यदि आप ASCII के लिए खुद को प्रतिबंधित करते हैं, तो निचले मामले में परिवर्तित होने के लिए बिट 0x60 के बराबर है:

for(char *p = pstr; *p; ++p)
    *p = *p > 0x40 && *p < 0x5b ? *p | 0x60 : *p;

6
इसे थोड़ा और पठनीय बनाने के लिए आप कर सकते हैंfor(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
ग्रेटर पीटर्स

7
यह संस्करण वास्तव में ग्लिब्स की तुलना में धीमा है tolower()। मेरी मशीन पर 55.2 बनाम 44.15।
jfs

मैं कल्पना नहीं कर सकता कि: tolower () chars से संबंधित है; केवल अगर यह मैक्रो है
ओलेग रज़ुल्येव

1
@oraz: tolower () के int (*)(int)हस्ताक्षर हैं। यहाँ प्रदर्शन माप के लिए इस्तेमाल किया गया कोड gist.github.com/370497
jfs

@ जेएफ: मैं देखता हूं, उन्होंने टेबल का इस्तेमाल किया है, लेकिन मैं ऑप्टिमाइज़ कर सकता हूं: ((; p; ++ p) अगर (* p> 'Z') {जारी;} और अगर (* p <'A'); {जारी;} और {* p = * p। 0x60;}
ओलेग रज़ुल्येव

1

क्या आप सिर्फ ASCII स्ट्रिंग्स के साथ काम कर रहे हैं, और कोई स्थानीय मुद्दे नहीं हैं? फिर हां, यह करने का एक अच्छा तरीका होगा।


क्या होगा यदि टोलवर () को गैर-अस्सी अज़ चार पर बुलाया जाए? पसंद '!' या '#'। मैंने इसे '#' पर परखा और यह ठीक काम करने लगा। क्या यह आम तौर पर सभी अस्सी चर के लिए सच है जो अक्षर अज़ नहीं हैं?
टोनी स्टार्क

1
@ फाटाडे: tolower()तर्क को अपरिवर्तित छोड़ देता है यदि वह 'ए' .. 'जेड' श्रेणी में नहीं है।
jfs

1
! और # दोनों अस्सी चरस हैं। मार्क UTF8 जैसे अन्य एन्कोडिंग का जिक्र कर रहा था, जहां आप यह नहीं मान सकते कि प्रति चरित्र एक बाइट है (जैसा कि यह समाधान करता है)
hdgarrood


1

यदि हम उपयोग के रूप में के रूप में मैला होने जा रहे हैं tolower(), यह करें:

char blah[] = "blah blah Blah BLAH blAH\0"; int i=0; while(blah[i]|=' ', blah[++i]) {}

लेकिन, ठीक है, यह थोड़े से विस्फोट करता है यदि आप इसे कुछ प्रतीकों / अंकों को खिलाते हैं, और सामान्य तौर पर यह बुराई है। अच्छा साक्षात्कार प्रश्न, हालांकि।


6
हाँ, यह विभिन्न प्रतीकों (ASCII में, किसी भी प्रतीक, नियंत्रण वर्ण या अंक 5 बिट के साथ अंक के साथ अंकन / मोड़ / मोड़ देगा) बिट 5 सेट, आदि के साथ एक ही चरित्र कोड बन जाएगा) तो वास्तव में, गंभीरता से, नहीं इसका इस्तेमाल करें।
केन एस

इस पोस्ट में मेटा पर चर्चा की गई है ।
पैट्रिक हॉफमैन

0

बेहतर प्रदर्शन हासिल करने के लिए पॉइंटर को ढीला करना:

#include <ctype.h>

char* toLower(char* s) {
  for(char *p=s; *p; p++) *p=tolower(*p);
  return s;
}
char* toUpper(char* s) {
  for(char *p=s; *p; p++) *p=toupper(*p);
  return s;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.