I am trying to learn string in c. I have written this program. I want this program will terminate for a particular word (press ENTER after typing the word). Its Compile well but after given input when I pressing enter it shows me this message: test.exe has stopped working. Here "test" is the name of my program. Please help me to understand this.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    int i, j;

        char *str[10];
        for(i=0; i<10; i++)
        {
            //gets(str[i]);
            scanf("%s",str[i]);
            if(str[i]=="man") break;
        }


        for(j=0; j<10; j++)
        {
            printf("%s\n",str[j]);
        }

    return 0;
}

asked 10 Dec '16, 21:04

mars's gravatar image

mars
213


আপনার char *str[10] এই লাইন টি কেবল মাত্র 10 pointer to char array এটা কোন ভ্যালিড এড্রেস hold করছে না । তাই আপন যখন scanf("%s", str[i]) দিয়ে ইনপুট নিচ্ছেন তখন ইনভ্যালিড এড্রেস অ্যাক্সেস করার কারনে আপনার প্রোগ্রাম crash করছে ।

এই সমস্যা আপনি দুই ভাবে সমাধান করতে পারবেন । প্রথমত আপনি ইনপুট নেয়ার আগেই আপনর *str[10] এর জন্য ভ্যালিড মেমরি Allocate করে রাখতে পারেন ।

Code for memory allocation:

MAX_SIZE = 500;
for(i=0;i<10;i++)
    str[i] = (char*)malloc(sizeof(char) * MAX_SIZE);

আপনি যদি এই ভাবে মেমরি allocate করতে না চান তবে আপনাকে char *str[10]; কে লিখতে হবে char str[10]; [MAX_SIZE]; তাহলেই ভ্যালিড মেমরি এড্রেস allocate হয়ে যাবে :)

এখন আপনি ইনপুট নিতে পারেন এই ভাবে

for(i = 0; i < 10; i++) {
    scanf("%s", str[i]);
    // Do other things 
}

এখন সমস্যা হল আপনি str[i] == "man" এই ভাবে স্ট্রিং C তে Compare করতে পারবেন না । স্ট্রিং Compare করেতে হলে strcmp() ফাংশন ব্যবহার করে করতে হবে । আপনি যেহেতু দুইটা স্ট্রিং সমান কি না সেটা টেস্ট করবেন তার জন্য আপনা কে এই এই ভাবে করতে হবে ।

if(strcmp(str[i], "man") == 0) {
    break;
}

দুইটা স্ট্রিং যদি সমান হয় তবে এই ফাংশন টি ০ রিটার্ন করে । তাই আমারা == ০ লিখেছি ।

আপনার প্রিন্ট লুপ টাও সেভ না । এখানে আপনি ০ থেকে ৯ পর্যন্ত লুপ চালাচ্ছেন । এখন দেখা গেল আপনি ৫ টা স্ট্রিং ইনপুট নেয়ার পর "man" ইনপুট দিছেন । কিন্তু আপনার লুপ কিন্তু সেই ৫ পর্যন্ত চলার কথা কিন্তু এই ক্ষেত্রও আপনার লুপ ৯ পর্যন্তই চলবে । তাই ৫ এর পর যেহেতু কোন ভালু রাখা হয় নি তাই ৫ এর পর উলটাপাল্টা মান প্রিন্ট করবে :)

এই সমস্যা সমাধান করার জন্য আপনি আপানর প্রিন্ট লুপ টা নিচর মত করে লিখতে পারেন ।

for(j = 0; j < i; j++) {
    printf("%s\n", str[j]);
}

ধন্যবাদ :)

permanent link

answered 11 Dec '16, 05:52

menon's gravatar image

menon
4.7k335

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:

×402
×56
×56
×17

question asked: 10 Dec '16, 21:04

question was seen: 712 times

last updated: 11 Dec '16, 05:52