নিটনের বই "সবার জন্য সি" তে দেখলাম string ইনপুট নেওয়ার জন্য char টাইপ pointer এভাবে gets(char_pointer); ইউজ করছেন। যেইটা codeblocks এ রান করলে ইরর টাইপের কিছু আসে। (ঐ বইয়ের সব কোড টার্বো সি তে লিখা)

যদি ইরর নাও আসতো আমার প্রশ্ন থাকতো এখানে char টাইপ pointer ভ্যারিয়েবলের জন্য string ইনপুট নিলো কিভাবে? char টাইপ pointer তো ডাটা হিসাবে char টাইপ ভ্যারিয়েবলের এড্রেস রাখবে।

যাই হোক, আমার প্রশ্ন হচ্ছে, char টাইপ array'র মত string ইনপুট নেওয়ার জন্য কি char টাইপ pointer ব্যাবহার করা যায়?

যদি যায় কিভাবে ইনপুট নিতে হয়? ইনপুট নিলে string টা মেমোরিতে কিভাবে থাকবে?

ধন্যবাদ :)

asked 21 Feb '16, 09:16

_Shaon_'s gravatar image

_Shaon_
796323


এখানে একটি বেসিক কনসেপ্ট আছে ।

আমরা জানি পয়েন্টার এড্রেস নিয়ে কাজ করে। আমরা যদি একটি char টাইপ পয়েন্টার ডিক্লিয়ার করি তাহলে তা একটি ক্যারেক্টার ভেরিয়েবল পয়েন্ট করতে পারবে।

char str[] = "Hello";
char *p;

এখানে আমি একটি ক্যারেকটার এ্যরে এবং একটি ক্যারেকটার পয়েন্টার নিলাম। এখন কিন্তু p এর কোনো এড্রেস নাই, মান ও নাই। তাই p নিয়ে কাজ ও করতে পারব না।

আমি যে কাজটি করবো তা হলো str[] এরে এর সুরুর এড্রেসটি *p কে দিব। তাহলে হবে এরকম।

p = &str[0];

এবার কিছু প্রিন্ট চালাই ।

printf("%c\n",*p); // আউটপুট H
printf("%c\n",*(p+1)); // আউটপুট e
printf("%s\n",p);  // আউটপুট Hello

তার মানে p এর সাহায্যেও আমরা str টির মান নিয়ে কাজ করতে পারছি ।

আবার একটি বিষয় , &str[0] এবং str একই। দুইটিই একটি স্ট্রিং ভেরিয়েবল এর শুরুর এড্রেস নির্দেস করে । এইজন্য বলা হয় ক্যারেকটার পয়েন্টার।

#include< stdio.h>
int main()
{
    char *p;
    char str[100];
    p = str;
    gets(p); // ইনপুট Hello
    printf("%s\n",p); // আউটপুট Hello
    printf("%s\n",str); // আউটপুট Hello

    return 0;
}

এখানে *p পয়েন্ট করার জন্য আপনাকে একটি অতিরিক্ত ক্যারেকটার এরে str দরকার হচ্ছে। ডায়নামিক মেমরি এলোকেসনের মাধ্যমে এ সমসসার সমাধান করা যায় ।

নিচের বাংলা টিউটোরিয়ালগুলো দেখতে পারেন।

Pointer with array
Dynamic memory allocation ( malloc )
Dynamic memory allocation ( calloc )
Dynamic memory allocation ( realloc )
Dynamic memory allocation (Example malloc, calloc, realloc, free)

permanent link

answered 21 Feb '16, 12:43

Sharif%20Chowdhury's gravatar image

Sharif Chowdhury
3.5k111

শরিফ ভাই, আপনি শুরুতে যে বেসিক কনসেপ্টের কথা বলছেন, ঐটা আমারর জানা ছিলো। যেমনঃ আমি যদি শুরুতে এভাবে ডিক্লেয়ার char *p = "hello"; করি এখানে প্রথমে string টা মেমোরিতে থাকবে এরপর p এর জন্য h এর এড্রেসটা নির্ধারণ হবে। আর এইটা যদি %s দিয়ে print করতে চাই তাহলে p এর এড্রেস থেকে '\0' পাওয়া পর্যন্ত প্রিন্ট করতে থাকবে। এছাড়াও আপনি প্রথমে যে array'র বেস এড্রেস পয়েন্টারে রাখার উদাহরণ দিছেন ওগুলো পয়েন্টার শেখার সময় শিখছি। এরপর আপনি লাস্টে যে উদাহৃণ টা দিলেন ঐটা আমার জন্য কাজের ছিলো।

(21 Feb '16, 15:20) _Shaon_

শরিফ ভাই, আপনি শুরুতে যে বেসিক কনসেপ্টের কথা বলছেন, ঐটা আমারর জানা ছিলো। যেমনঃ আমি যদি শুরুতে এভাবে ডিক্লেয়ার char *p = "hello"; করি এখানে প্রথমে string টা মেমোরিতে থাকবে এরপর p এর জন্য h এর এড্রেসটা নির্ধারণ হবে। আর এইটা যদি %s দিয়ে print করতে চাই তাহলে p এর এড্রেস থেকে '\0' পাওয়া পর্যন্ত প্রিন্ট করতে থাকবে। এছাড়াও আপনি প্রথমে যে array'র বেস এড্রেস পয়েন্টারে রাখার উদাহরণ দিছেন ওগুলো পয়েন্টার শেখার সময় শিখছি। এরপর আপনি লাস্টে যে উদাহৃণ টা দিলেন ঐটা আমার জন্য কাজের ছিলো।

(21 Feb '16, 15:20) _Shaon_

তাহলে আপনি এই বলতে চাচ্ছেন যে আমি মেমোরি অ্যালোকেশনের অধ্যায় না পড়া পর্যন্ত ডিরেক্ট pointer এ string ইনপুট নিতে চাইলে আলাদা একটা char array ডিক্লেয়ার করে নিতে হবে? এছাড়া আপাতত সম্ভব না?

(21 Feb '16, 15:21) _Shaon_

তাহলে আপনি এই বলতে চাচ্ছেন যে আমি মেমোরি অ্যালোকেশনের অধ্যায় না পড়া পর্যন্ত ডিরেক্ট pointer এ string ইনপুট নিতে চাইলে আলাদা একটা char array ডিক্লেয়ার করে নিতে হবে? এছাড়া আপাতত সম্ভব না?

(21 Feb '16, 15:21) _Shaon_

ঠিক ধরেছেন ।

(22 Feb '16, 14:40) Sharif Chowdhury

Thanks Sharif vai :)

(24 Feb '16, 06:59) _Shaon_

Thanks Sharif vai :)

(24 Feb '16, 06:59) _Shaon_
showing 5 of 7 show 2 more comments
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×90
×17
×6

question asked: 21 Feb '16, 09:16

question was seen: 1,060 times

last updated: 24 Feb '16, 06:59