আমি কীভাবে সি তে একটি স্ট্রিং ছোট করব?


108

আমি কীভাবে মিশ্রিত কেস স্ট্রিংকে সি এর একটি ছোট হাতের স্ট্রিংয়ে রূপান্তর করতে পারি?


2
আপনি কি কেবলমাত্র চিঠিপত্রের সাথে এএসসিআইআইয়ের সাথে কেবলমাত্র চিঠিটি ব্যবহার করছেন?
মার্ক বায়ার্স

1
ASCII। আমি কীভাবে তা আমলে নেব? নীচের উদাহরণ এখনও কাজ করবে? আমার চরটি যদি একটি '#' হয় এবং টোলভার () এর উপর কল করে তবে কী হবে?
টনি স্টার্ক

1
এটা চলবে. আমি আরও ভাবছিলাম যদি আপনার স্ট্রিংয়ে é বা if এর মতো জিনিস থাকে Ü
মার্ক বাইয়ার্স

1
শুধু "স্ট্রলউইআর" ব্যবহার করবেন না কেন? strlwr((char*)str);এটি কেবল স্ট্রিংয়ের মধ্য দিয়ে যায় এবং এটিকে নিজেই রূপান্তর করে।
ল্যারি

@ ল্যারি এটি অ-মানক।
মধ্য

উত্তর:


152

এটি স্ট্যান্ডার্ড লাইব্রেরিতে রয়েছে এবং এ জাতীয় ফাংশনটি বাস্তবায়নের জন্য আমি দেখতে সবচেয়ে সোজা এগিয়ে forward হ্যাঁ, কেবল স্ট্রিংটির মধ্য দিয়ে লুপ করুন এবং প্রতিটি অক্ষরকে ছোট হাতের মধ্যে রূপান্তর করুন।

এর মতো তুচ্ছ কিছু:

#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);আরও বুদ্ধিমান মনে হয়।
jfs

14
@ জেএফ আপনি সেখানে যান। কোডটি ভীতিজনক বা সুন্দর দেখায় কিনা তার উপর নির্ভর করে :) (খুব পঠনযোগ্য একটি লাইনার তবে এটি ভীতিজনক দেখাচ্ছে)
আর্লজ

এটি আমাকে সেগফল্ট দেয় যদি স্ট আর হয় char *, তবে স্ট্র্ট একটি চর অ্যারে নয়। এর জন্য কোনও ব্যাখ্যা পেয়েছেন?
বৈদ্যুতিন কফি

1
আমি বিশ্বাস করি যে একটি লাইনার আপনাকে স্ট্রিংটিতে আপনার পয়েন্টারটি হারাতে বাধ্য করবে।
Ace.C

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

আমি এটি কল্পনা করতে পারি না: টোলভার () চরগুলি নিয়ে কাজ করে; শুধুমাত্র যদি এটি ম্যাক্রো হয়
ওলেগ রাজ্জুলিয়ায়েভ

1
@oraz: টোলভার () এর int (*)(int)স্বাক্ষর রয়েছে। পারফরম্যান্স পরিমাপের জন্য ব্যবহার করা কোডটি এখানে gist.github.com/370497
jfs

@ জেএফ: আমি দেখছি, তারা টেবিলটি ব্যবহার করেছে তবে আমি অনুকূলিত করতে পারি: (; * পি; ++ পি) এর জন্য (* পি> 'জেড') {চালিয়ে যান} অন্যথায় যদি (* পি <'এ') {অবিরত;} অন্য {* পি = * পি | 0x60;}
ওলেগ Razgulyaev

1

আপনি কি কেবল এএসসিআইআই স্ট্রিং নিয়ে কাজ করছেন, এবং কোনও স্থানীয় সমস্যা নেই? তাহলে হ্যাঁ, এটি করার ভাল উপায় হবে।


যদি টোলওয়ার () কে অ-এসকিআই আজ চরে ডাকা হয়? 'মত!' বা '#'। আমি এটি '#' তে পরীক্ষা করেছি এবং দেখে মনে হচ্ছে এটি ঠিক আছে। এটি সাধারণত সমস্ত এসকি চরগুলির জন্য সত্য যা অক্ষর আজ না?
টনি স্টার্ক

1
@ হটোরড: tolower()যুক্তিটি 'এ' .. 'জেড' সীমার মধ্যে না থাকলে অপরিবর্তিত রাখে।
jfs

1
! এবং # উভয়ই আসকি চরগুলি। মার্ক ইউটিএফ 8 এর মতো অন্যান্য এনকোডিংগুলিকে উল্লেখ করছে, যেখানে আপনি অনুমান করতে পারবেন না যে চরিত্র অনুসারে একটি বাইট রয়েছে (যেমন এই সমাধানটি করে)
hdgarrood


1

আমরা যদি ব্যবহার করার মতো ঝাল হয়ে যাচ্ছি তবে tolower()এটি করুন:

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

তবে, ভাল, আপনি কিছু চিহ্ন বা সংখ্যা খাওয়ান, তবে সাধারণভাবে এটি মন্দ evil ভাল সাক্ষাত্কার প্রশ্ন, যদিও।


6
হ্যাঁ, এটি বিভিন্ন চিহ্নকে ভাঁজ / স্পিন্ডল / বিভক্ত করবে (এএসসিআইআইতে, কোনও চিহ্ন, নিয়ন্ত্রণের অক্ষর, বা বিট 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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.