সি
আমার হোমওয়ার্ক অ্যাসাইনমেন্টটি একটি স্ট্রিং নেবে এবং প্রতিটি নতুন লাইনে এটিকে টুকরো টুকরো করে। আমার কোনো ধারণা নেই কী করতে হবে! সাহায্য করুন!
শুরুর সি প্রোগ্রামিং ক্লাসের জন্য কূট সমস্যা! প্রথমে আপনাকে এই জটিল বিষয় সম্পর্কে কয়েকটি বেসিকটি বুঝতে হবে।
একটি স্ট্রিং হল একটি অক্ষর যা কেবলমাত্র অক্ষর দ্বারা গঠিত । এর অর্থ হ'ল প্রোগ্রামাররা একটি "অদৃশ্য" জিনিসটি নির্দেশ করতে (এটি কোনও স্থান নয় যা একটি চরিত্র হিসাবে গণ্য হয়), আপনাকে সেই অদৃশ্য জিনিসটি বোঝাতে কোনওভাবে অক্ষরের একটি বিশেষ ক্রম ব্যবহার করতে হবে ।
উপর উইন্ডোজ , নতুন লাইন একটি ক্রম দুই ব্যাকস্ল্যাশ এবং n (বা স্ট্রিং: STRING অক্ষর "\n"
)
উপর লিনাক্স বা ওএস / এক্স Macs- এর , এটা একটি ক্রম চার ব্যাকস্ল্যাশ, এন, ব্যাকস্ল্যাশ, এবং তারপর দ: (অথবা অক্ষর "\n\r"
)।
(আকর্ষণীয় historicalতিহাসিক দ্রষ্টব্য: পুরানো ম্যাকিনটোশে এটি চারটি চরিত্রের আলাদা ধারা ছিল: "\ r \ n" ... ইউনিক্স কীভাবে কাজ করেছিল তার থেকে পুরোপুরি পিছনে! ইতিহাসটি অদ্ভুত রাস্তা নেয়))
এটি লিনাক্স উইন্ডোজের চেয়ে বেশি অপচয়যোগ্য বলে মনে হতে পারে তবে দীর্ঘতর ক্রমটি ব্যবহার করা আসলে এটি একটি ভাল ধারণা। উইন্ডোজ এই জাতীয় সংক্ষিপ্ত ক্রম ব্যবহার করে সি ভাষার রানটাইম \n
বিশেষ সিস্টেম কল ব্যবহার না করে প্রকৃত অক্ষরগুলি মুদ্রণ করতে পারে না । আপনি করতে পারেন সাধারণত একটি সিস্টেম কল (এটা এমনকি মুদ্রণ করতে পারেন ছাড়া লিনাক্স এটা করতে \n\
বা \n\q
... কিন্তু কিছু \n\r
)। সি যেহেতু ক্রস প্ল্যাটফর্ম হিসাবে বোঝানো হয়েছে এটি সর্বনিম্ন সাধারণ-ডিনোমিনেটরকে কার্যকর করে। সুতরাং আপনি সর্বদা \n
আপনার বইতে দেখতে পাবেন ।
(দ্রষ্টব্য: আপনি যদি ভাবছেন যে প্রতিবার আমরা কীভাবে \n
নিউলাইন না পেয়ে আমরা কীভাবে কথা বলব , স্ট্যাকওভারফ্লো প্রায় পুরোপুরি এইচটিএমএল লেখা হয় ... সি তে নয় তাই এটি অনেক বেশি আধুনিক C সি এর পুরানো দিকগুলির অনেকগুলি হ'ল আপনি শুনেছেন এমন বিষয়গুলির দ্বারা সম্বোধন করা, যেমন ক্ল্যাং এবং এলএলভিএম))
তবে আমরা কী নিয়ে কাজ করছি তা ফিরে। আসুন তিনটি টুকরো এবং দুটি নিউলাইন সহ একটি স্ট্রিং কল্পনা করুন:
"foo\nbaz\nbar"
আপনি দেখতে পাচ্ছেন যে স্ট্রিংয়ের দৈর্ঘ্য 3 + 2 + 3 + 2 + 3 = 13. সুতরাং আপনাকে এর জন্য 13 দৈর্ঘ্যের একটি বাফার তৈরি করতে হবে এবং সি প্রোগ্রামাররা সর্বদা তাদের অ্যারের আকারে নিরাপদ থাকতে একটি যুক্ত করে। সুতরাং আপনার বাফার তৈরি করুন এবং এতে স্ট্রিংটি অনুলিপি করুন:
/* REMEMBER: always add one to your array sizes in C, for safety! */
char buffer[14];
strcpy(buffer, "foo\nbaz\nbar");
এখন আপনাকে যা করতে হবে তা হল দ্বি-চরিত্রের প্যাটার্নটি অনুসন্ধান করা যা নিউলাইনটিকে উপস্থাপন করে। আপনাকে কেবল একটি ব্যাকস্ল্যাশ সন্ধান করার অনুমতি নেই । যেহেতু সি স্ট্রিং বিভক্ত করার জন্য বেশ ব্যবহৃত হয়, আপনি চেষ্টা করলে এটি আপনাকে একটি ত্রুটি দেয়। আপনি লেখার চেষ্টা করলে এটি দেখতে পাবেন:
char pattern[2];
strcpy(pattern, "\");
(দ্রষ্টব্য: সংকলকটিতে একটি সেটিংস রয়েছে যদি আপনি এমন কোনও প্রোগ্রাম লিখছেন যা কেবল ব্যাকস্ল্যাশগুলির সন্ধান করে But তবে এটি অত্যন্ত অস্বাভাবিক; ব্যাকস্ল্যাশ খুব কম ব্যবহার করা হয়, এজন্য এগুলি তাদের এই উদ্দেশ্যে বেছে নেওয়া হয়েছিল We আমরা এটি ঘুরিয়ে দেব না We চালু করা.)
সুতরাং আসুন আমরা এটির মতো প্যাটার্নটি তৈরি করি:
char pattern[3];
strcpy(pattern, "\n");
যখন আমরা দুটি স্ট্রিং তুলনা করতে চাই যা নির্দিষ্ট দৈর্ঘ্যের হয়, আমরা ব্যবহার করি strncmp
। এটি সম্ভাব্য বৃহত্তর স্ট্রিংয়ের একটি নির্দিষ্ট সংখ্যক অক্ষরের তুলনা করে এবং সেগুলি মেলে কিনা তা আপনাকে জানায়। সুতরাং strncmp("\nA", "\nB", 2)
1 (সত্য) প্রদান করে। এটি স্ট্রিংগুলি তিনটির দৈর্ঘ্যের চেয়ে সম্পূর্ণ সমান নয় যদিও ... তবে কারণ কেবল দুটি অক্ষর হওয়া দরকার।
আমাদের বাফার মাধ্যমে আসুন ধাপে সুতরাং, এক একটি সময়ে চরিত্র, খুঁজছেন দুই আমাদের প্যাটার্ন চরিত্র ম্যাচ। প্রতিবার আমরা যখন এন এর পরে ব্যাকস্ল্যাশের দ্বি-চরিত্রের ক্রম খুঁজে পাই, আমরা একটি বিশেষ ধরণের চরিত্রটি প্রকাশ করতে খুব বিশেষ সিস্টেম কল (বা "সিস্কেল") ব্যবহার করব putc
: একটি শারীরিক নিউলাইন পেতে ASCII কোড 10 ।
#include "stdio.h"
#include "string.h"
char buffer[14]; /* actual length 13 */
char pattern[3]; /* actual length 2 */
int i = 0;
int main(int argc, char* argv[]) {
strcpy(buffer, "foo\nbar\nbaz");
strcpy(pattern, "\n");
while (i < strlen(buffer)) {
if (1 == strncmp(buffer + i, pattern, 2)) {
/* We matched a backslash char followed by n */
/* Use syscall for output ASCII 10 */
putc(10, stdout);
/* bump index by 2 to skip both backslash and n */
i += 2;
} else {
/* This position didn't match the pattern for a newline */
/* Print character with printf */
printf("%c", buffer[i]);
/* bump index by 1 to go to next matchable position */
i += 1;
}
}
/* final newline and return 1 for success! */
putc(10, stdout);
return 1;
}
এই প্রোগ্রামের আউটপুটটি কাঙ্ক্ষিত ফলাফল ... স্ট্রিং বিভক্ত!
foo
baz
bar
\t
ট্রোলিংয়ের জন্য ...
উপর থেকে নীচে একেবারে ভুল। তবুও পাঠ্যপুস্তক বা উইকিপিডিয়াতে যা আছে তার মতো তথ্য স্ক্র্যাম্বল করে এমন কলুষিত-সাউন্ডিং বাজে কথা ভরা। প্রোগ্রামের যুক্তি ভুল তথ্য প্রসঙ্গে স্বচ্ছ প্রদর্শিত হয়, তবে এটি সম্পূর্ণ বিভ্রান্তিকর। এমনকি বিশ্বব্যাপী ভেরিয়েবলগুলি এবং ভাল পরিমাপের জন্য একটি ত্রুটি কোড ফিরিয়ে দেওয়া ...
...
অবশ্যই, দুটি অক্ষরের উত্স আক্ষরিক অনুক্রমের সি স্ট্রিংয়ের উপস্থাপনায় কেবল একটি অক্ষর রয়েছে \n
। তবে একটি বাফারকে আরও বড় করা ক্ষতিকারক, যতক্ষণ strlen()
না চালানোর জন্য প্রকৃত দৈর্ঘ্য পেতে ব্যবহৃত হয়।
...
আমরা পাঠককে বোঝানোর চেষ্টা করি যে strncmp
একটি বুলিয়ান অপারেশন যা হয় (1) এর সাথে মেলে বা না (0)। তবে এটির তিনটি রিটার্ন মান রয়েছে (-1 কম মিলছে, 0 সমমানের জন্য 1, আরও বেশি মিলের জন্য 1) । আমাদের দুটি চরিত্রের "প্যাটার্ন" তুলনা করা হচ্ছে [ \
, n
] নয়, বরং [ \n
, \0
] ... নিখুঁত নাল টার্মিনেটর বাছাই করা। যে ক্রমটি স্ট্রিংয়ের মধ্য দিয়ে স্লাইড হয় এটি এর সাথে তুলনা করা দ্বি-চরিত্রের অনুক্রমের চেয়ে বড় কখনই হবে না ... ইনপুট স্ট্রিংয়ে একটি সমাপনী নিউলাইন থাকলে সর্বোত্তমভাবে এটি শূন্য হবে।
...
সুতরাং এই সমস্ত স্ট্রিং মাধ্যমে লুপ হয় এবং এটি একবারে একটি অক্ষর মুদ্রণ। শীর্ষ শাখা কখনও চালায় না। (যদিও আপনার স্ট্রিংটিতে এতে \n
কোডের চেয়ে কম কোড থাকলে তা পেতে পারত , ট্যাব বলুন ... যা আউটপুট থেকে রহস্যজনকভাবে অক্ষরগুলি বাদ দিতে ব্যবহৃত হতে পারে :-P)