কীভাবে স্ট্রিংটি C ++ এ চর অ্যারে রূপান্তর করবেন?


106

আমি রূপান্তর করতে চাই stringথেকে charঅ্যারের কিন্তু char*। আমি জানি যে স্ট্রিংটি কীভাবে রূপান্তর করতে হবে char*(ব্যবহার করে mallocবা আমি আমার কোডটিতে যেভাবে পোস্ট করেছি) - তবে এটি আমি চাই না। আমি কেবল অ্যারেতে রূপান্তর stringকরতে চাই char[size]। এটা কি সম্ভব?

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main()
{
    // char to string
    char tab[4];
    tab[0] = 'c';
    tab[1] = 'a';
    tab[2] = 't';
    tab[3] = '\0';
    string tmp(tab);
    cout << tmp << "\n";

    // string to char* - but thats not what I want

    char *c = const_cast<char*>(tmp.c_str());
    cout << c << "\n";

    //string to char
    char tab2[1024];
    // ?

    return 0;
}

12
এটি সি ++, সি হিসাবে নয় বলে মনে হচ্ছে
ফ্রেড লারসন

@ ফ্রেডলারসন: ঠিক আছে, সম্পাদিত, ধন্যবাদ
ব্রায়ান ব্রাউন

4
সম্ভাব্য নকল নকল: স্ট্রিং থেকে চর *
সেগপ্রকাশ

উত্তর:


129

এটি করার সবচেয়ে সহজ উপায় আমি এটি ভাবতে পারি:

string temp = "cat";
char tab2[1024];
strcpy(tab2, temp.c_str());

সুরক্ষার জন্য, আপনি পছন্দ করতে পারেন:

string temp = "cat";
char tab2[1024];
strncpy(tab2, temp.c_str(), sizeof(tab2));
tab2[sizeof(tab2) - 1] = 0;

বা এই ফ্যাশন হতে পারে:

string temp = "cat";
char * tab2 = new char [temp.length()+1];
strcpy (tab2, temp.c_str());

10
এর সাহায্যে ধরাটি strncpyহ'ল এটি উত্সের স্ট্রিংয়ের মধ্যে কোনও শূন্য খুঁজে পাওয়ার আগে আকারে পৌঁছলে এটি বাতিল হবে না। তার সাথেও সাবধান!
ফ্রেড লারসন

4
হ্যাঁ, আমি মনে করি এটি এটিকে পরিচালনা করার একটি যুক্তিসঙ্গত উপায়।
ফ্রেড লারসন

4
আরআরএনপিপি সেই সুরক্ষার জন্য যে স্ট্রঙ্কপি আপনি যে বাফারটি দিয়েছেন তা অতিক্রম করবে না। এছাড়াও strcpy_s সি 99 এ নেই, তবে এটি সম্প্রতি সি 11 এ যুক্ত করা হয়েছে।
bames53

7
লোকেরা সুরক্ষা শব্দের যেভাবে অপব্যবহার করে তা আমি পছন্দ করি ... ওহ, স্ট্রিংয়ের পর্যাপ্ত জায়গা নেই, তাই আসুন এটি কেটে দিন .. ওহ, আমরা ঘটনাক্রমে রোগীর জীবনের ওষুধের ওষুধের অ্যালার্জি সম্পর্কিত তথ্য সরিয়ে দিয়েছি .. তবে আমাদের কাছে নেই একটি বাফার আর ছাড়িয়ে গেছে। ঠিক আছে, আমার ধারণা এটি নিরাপদ ...
করলি হরওয়থ

5
@ কারলিহর্ভাথ - বিভিন্ন ডোমেনে সুরক্ষা। স্পষ্টতই, আপনার নিজের কার্যকরী প্রয়োজনীয়তা এবং বোকা জিনিসগুলি না করা উচিত check তবে আপনি যদি বাফারকে ছাপিয়ে যান তবে কী হবে তা জানার কোনও গ্যারান্টি হারাতে পারেন। সঠিক কোডিং নিশ্চিত করে যে প্রোগ্রামটি আপনার ওএস এ চালানোর জন্য "নিরাপদ" আছে। সঠিক চিন্তাভাবনা নিশ্চিত করে যে ব্যবহারকারীর যা প্রয়োজন তা করাতে প্রোগ্রামটি "নিরাপদ"।
চৌলেট

59

ঠিক আছে, আমি হতবাক হয়েছি যে সত্যিই কেউ ভাল উত্তর দেয় না, এখন আমার পালা। দুটি মামলা আছে;

  1. একটি ধ্রুবক চর অ্যারে আপনার পক্ষে যথেষ্ট তাই আপনি সাথে যান,

    const char *array = tmp.c_str();
    
  2. অথবা আপনার চর অ্যারেটি সংশোধন করা দরকার তাই ধ্রুবক ঠিক নেই, তবে কেবল এটির সাথে যান

    char *array = &tmp[0];
    

এগুলি উভয়ই কেবল অ্যাসাইনমেন্ট অপারেশন এবং বেশিরভাগ সময় যা আপনার প্রয়োজন ঠিক তেমন, যদি আপনার সত্যই কোনও নতুন অনুলিপি প্রয়োজন হয় তবে অন্যান্য ফেলো উত্তরগুলি অনুসরণ করুন।


7
তিনি চরের অ্যারে চান, চর নয় *
হ্যারোগাস্টন

10
তিনি যে পয়েন্টারটি তৈরি করেছেন সেটি হ'ল চর অ্যারে হিসাবে একই জিনিস। সি এবং সি ++ এ অ্যারে ভেরিয়েবল হ'ল অ্যারের প্রথম উপাদানটির কেবলমাত্র পয়েন্টার।
জাস্টিনসিবি

@ জাস্টিনসি.বি। আসলে তা না! অ্যারে ভেরিয়েবলগুলি পয়েন্টারগুলিতে ক্ষয় হতে পারে তবে সেগুলি সি ++ তে এক নয়। উদাহরণস্বরূপ std::size(elem)সি ++ এ যখন elemএকটি char arrayহয় ঠিকভাবে সংজ্ঞায়িত হয় তবে এটি যখন elemহয় char*বা তখন এটি সংকলন করতে ব্যর্থ হয় const char*, আপনি এটি এখানে
aniliitb10

17

এটি করার সবচেয়ে সহজ উপায় এটি হবে

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());

15
অ্যারের আকার অবশ্যই সি ++ এ একটি সংকলন-সময় ধ্রুবক হতে হবে।
ইন্টারজয়

@ ইনটারজয় এটা খারাপ অভ্যাস নাকি ভুল?
ফানি ithত্বভিজ

@ ফণীরিথিভিজ এটি ভুল, যদি না আপনি কেবলমাত্র এমন একটি সংকলককে টার্গেট করেন যা এটিকে ভাষা সম্প্রসারণ হিসাবে মঞ্জুরি দেয়, সেক্ষেত্রে এটি এখনও খারাপ অভ্যাস।
ইন্টারজয়

13
str.copy(cstr, str.length()+1); // since C++11
cstr[str.copy(cstr, str.length())] = '\0';  // before C++11
cstr[str.copy(cstr, sizeof(cstr)-1)] = '\0';  // before C++11 (safe)

এটা তোলে সি সি এড়াতে ++, একটি উন্নততর অনুশীলন, তাই std :: স্ট্রিং :: কপি পরিবর্তে পছন্দ হওয়া উচিত strcpy





2

আপনি যেমন ব্যবহার করতে পারেন strcpy():

strcpy(tab2, tmp.c_str());

বাফার ওভারফ্লোতে নজর রাখুন।


2

আপনি যদি স্ট্রিংয়ের আকারটি আগে জানেন না, আপনি গতিশীলভাবে একটি অ্যারের বরাদ্দ করতে পারেন:

auto tab2 = std::make_unique<char[]>(temp.size() + 1);
std::strcpy(tab2.get(), temp.c_str());

0

আপনি যদি সি ++ 11 বা তার std::snprintfবেশি ব্যবহার করে থাকেন তবে আমি এটির নিরাপত্তার কারণে std::strcpyবা std::strncpyতার ব্যবহারের পরামর্শ দিচ্ছি (যেমন, আপনি নির্ধারণ করেন যে আপনার বাফারে কতগুলি অক্ষর লেখা যেতে পারে) এবং কারণ এটি আপনার জন্য স্ট্রিংটি বাতিল করে দেয় (তাই) আপনার এটি নিয়ে চিন্তা করার দরকার নেই)। এটি এমন হবে:

#include <string>
#include <cstdio>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, sizeof(tab2), "%s", tmp.c_str());

সি ++ 17 এ আপনার কাছে এই বিকল্প রয়েছে:

#include <string>
#include <cstdio>
#include <iterator>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, std::size(tab2), "%s", tmp.c_str());

-1

আচ্ছা আমি এটিকে বোধহয় সহজ ও সাধারণের চেয়েও বোধহয় জানি তবে আমার মনে হয় এটির কাজ করা উচিত:

string n;
cin>> n;
char b[200];
for (int i = 0; i < sizeof(n); i++)
{
    b[i] = n[i];
    cout<< b[i]<< " ";
}

সত্যিই ভাল না. আপনি কেবল ধরে নিচ্ছেন যে এর nচেয়ে বড় হতে পারে না b। এটা যদি ক্রাশ হবে n>bstrcpyইতিমধ্যে সরবরাহ করা ফাংশনটি ব্যবহার করা আরও ভাল । সম্পাদনা করুন: কিছু ক্ষেত্রে এটি ব্যবহার করা আরও ভাল হতে পারে strcpy_sকারণ এটি
এনইউএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.