সি ভাষায় অপেরা কেস

আমার এই কোড আছে:

void changeToCapital(char* str)
{
    int i;
    for (i=0; i

এবং এই পদ্ধতিটি একটি গৃহস্থালি * ভেরিয়েবল পেতে অনুমিত হয় এবং এটি তার বড় হাতের অক্ষরে পরিবর্তন করে। কিছু কারণে আমি EXECUTE_BAD_ACCESS বলে একটি ত্রুটি পেয়েছি।

কলিং ফাংশন:

char* s = "itzik";
changeToCapital(s);
printf("%s\n",s);

আমি কি এখানে ভুল করছেন?

1
যোগ সম্পাদিত
মতামত: 1
আপনার ফাংশনটি একটি গৃহস্থালি * নেয় যদিও। আপনাকে এটি এবং str [i] পাস করতে হবে
যোগ লেখক Mike Kwan, উৎস
@ এইচ ২3২3: আমি শুধু তার উপর ভিত্তি করে মন্তব্য করছিলাম যে তিনি একটি str [i] এ প্রবেশ করছেন। কোডটি পরেই যোগ করা হয়েছিল।
যোগ লেখক Mike Kwan, উৎস
আমি কি str [i] করছি, না যে একটি গৃহস্থালি?
যোগ লেখক Itzik984, উৎস
পয়েন্টার সমস্যা মত শব্দ - কি স্ট্রিং দ্বারা str দ্বারা ক্র্যাশ হয় যখন এটি ক্র্যাশ?
যোগ লেখক wkl, উৎস
আপনি একটি স্ট্রিং আক্ষরিক সংশোধন করার চেষ্টা করছেন?
যোগ লেখক Tim Cooper, উৎস
কলিং ফাংশন দেখান
যোগ লেখক Benjamin Lindley, উৎস

2 উত্তর

এটি সম্ভবতঃ কারণ আপনি এটি নন-লিখনযোগ্য মেমোরিতে একটি পয়েন্টার নিচ্ছেন, যেমন একটি স্ট্রিং থেকে প্রাপ্ত একটি শব্দের আক্ষরিক:

char *ptr = "Hello";
changeToCapital(ptr);//<<== ERROR !

আপনি ত্রুটিটি এড়াতে কল পরিবর্তন করতে পারেন:

char ptr[] = "Hello";
changeToCapital(ptr);

একটি সাইড নোটে, উপরের ক্ষেত্রে আপনার পরিবর্তন কেবল তখনই কাজ করে যখন নিম্ন বর্ণের সমস্ত অক্ষর থাকে। আপনাকে 32 কোড বিয়োগ করার পরিবর্তে toupper (ch) ফাংশন ব্যবহার করতে হবে।

void changeToCapital(char* str) {
    for (; *str = toupper(*str) ; str++)
        ;
}
12
যোগ
@ রোবটকোপার আমি তুর্কি (এবং অন্যান্য অনেক সমগ্র ভাষা) জন্য কাজ না মনে করি এমনকি ইংরেজির জন্য এমনকি কাজ না চেয়ে ভাল :)
যোগ লেখক dasblinkenlight, উৎস
@ রবার্ট কুপার - কে তুর্কি সম্পর্কে একটি ধোঁকা দেয় !!
যোগ লেখক DumbCoder, উৎস
এবং toupper (ch) এখনও তুর্কি
যোগ লেখক Robert Cooper, উৎস

প্রথম:

আপনি ক্রমাগত strlen গণনা করছেন। পরিবর্তে, আপনি একটি স্থানীয় ভেরিয়েবল মধ্যে স্ট্রিং দৈর্ঘ্য সংরক্ষণ করা উচিত।

দ্বিতীয়: আপনি সম্ভবত এই মত ফাংশন আহ্বান করা হয়:

char *str = "Hello World";
changeToCapital(str);

এটি বিড"হ্যালো ওয়ার্ল্ড" হল const , এবং আপনার প্রোগ্রাম দ্বারা সংশোধন করা যাবে না। পরিবর্তে, আপনি একটি অক্ষর অ্যারের হিসাবে আপনার স্ট্রিং নির্দিষ্ট করা উচিত, নিশ্চিত যে এটি অপরিবর্তনীয়:

char str[] = "Hello World";
changeToCapital(str);
4
যোগ
strlen (str) এর মান তার কোডে ধ্রুবক নয়। str [i] = str [i] -32; যখন str [i] == '' এর প্রভাবটি বিবেচনা করুন।
যোগ লেখক Robᵩ, উৎস
@ H2CO3 - প্রশ্ন ছাড়া OP এর প্রোগ্রাম অনেক স্তরে ভুল। আমি নিছক নিরীক্ষণ করছি যে রিচার্ড এর অপ্টিমাইজেশান একই ফলাফল উত্পাদন করবে না।
যোগ লেখক Robᵩ, উৎস