วิธีการแปลงอาร์เรย์ถ่านเป็นสตริง?


254

แปลง C ++ stringไปแถวถ่านเป็น straightorward สวยโดยใช้ฟังก์ชั่นของสตริงแล้วทำc_str strcpyอย่างไรก็ตามวิธีการทำตรงข้าม?

ฉันมีแถวถ่านชอบที่จะแปลงกลับไปที่:char arr[ ] = "This is a test"; string str = "This is a test

คำตอบ:


369

stringชั้นจะมีคอนสตรัคที่ใช้เป็นโมฆะสิ้นสุด C-สตริง:

char arr[ ] = "This is a test";

string str(arr);


//  You can also assign directly to a string.
str = "This is another string";

// or
str = arr;

2
มันจะยังคงทำงานอย่างใดอย่างหนึ่ง ผู้ประกอบการที่ได้รับมอบหมายมากเกินไปใช้เวลาconst char*เพื่อให้คุณสามารถผ่านมันสตริงตัวอักษรหรืออาร์เรย์ถ่าน (ซึ่งสลายตัวไปที่)
ผู้วิเศษ

3
@ kingsmasher1: การพูดอย่างเคร่งครัดสตริงในรูปแบบ"hello world" คืออาร์เรย์ ถ้าคุณใช้sizeof("hello world")มันจะทำให้คุณมีขนาดของอาร์เรย์ (ซึ่งก็คือ 12) แทนที่จะเป็นขนาดของตัวชี้ (น่าจะเป็น 4 หรือ 8)
Dreamlax

7
โปรดทราบว่าสิ่งนี้ใช้ได้กับสตริง C ที่สิ้นสุด NULL คงที่เท่านั้น ตัวstringสร้างจะไม่ทำงานด้วยตัวอย่างเช่นสตริงอาร์กิวเมนต์ที่ส่งผ่านซึ่งประกาศว่าเป็นunsigned char * bufferสิ่งที่พบได้บ่อยมากในไลบรารีไบต์จัดการ
CXJ

4
ไม่จำเป็นต้องมีสิ่งใดที่คงที่ หากคุณมีบัฟเฟอร์แบบไบต์ประเภทอักขระใด ๆ คุณสามารถใช้ตัวสร้างอื่น ๆ : std::string str(buffer, buffer+size);แต่มันอาจจะดีกว่าถ้าคุณติดกับตัวอักษรstd::vector<unsigned char>ในกรณีนั้น
R. Martinho Fernandes

2
แม้ว่ามันอาจจะเห็นได้ชัด: strคือไม่ได้เปลี่ยนฟังก์ชั่นที่นี่ มันเป็นชื่อของตัวแปรสตริง คุณสามารถใช้ชื่อตัวแปรอื่น ๆ (เช่นstring foo(arr);) การแปลงจะกระทำโดยนวกรรมิกของ std :: string ที่เรียกว่า implicitly
Christopher K.

55

วิธีแก้ปัญหาอื่นอาจมีลักษณะเช่นนี้

char arr[] = "mom";
std::cout << "hi " << std::string(arr);

ซึ่งหลีกเลี่ยงการใช้ตัวแปรพิเศษ


คุณช่วยระบุในคำตอบว่าสิ่งนี้แตกต่างจากคำตอบที่ผิดพลาดของฉันได้อย่างไร?
Maarten Bodewes

@owlstead โปรดดูการแก้ไข ฉันเพียงแค่ใส่คำตอบของฉันเพราะมันเป็นสิ่งที่ฉันต้องการฉันเห็นเมื่อฉันเจอหน้านี้ครั้งแรกเพื่อหาคำตอบ หากใครบางคนที่โง่เหมือนฉันเข้ามาในหน้านี้ แต่ไม่สามารถทำการเชื่อมต่อนั้นจากการดูคำตอบแรกฉันหวังว่าคำตอบของฉันจะช่วยพวกเขา
stackPusher

5
As string () เป็นตัวสร้างของ std :: string มันอาจคุ้มค่าที่จะกล่าวถึงว่าคุณต้องเพิ่ม namespace std ในกรณีที่คุณไม่ได้ใช้ std namespace ตัวอย่าง:cout << "test:" + std::string(arr);
Christopher K.

1
@ChristopherK ฉันออกไปเพราะคำตอบที่ได้รับความนิยมสูงสุด คำตอบของฉันมีไว้เพื่อเป็นส่วนเสริมของคำตอบนั้นดังนั้นฉันจึงยังคงสมมติฐานเดิมไว้ หวังว่าทุกคนที่ไม่เข้าใจว่าจะเห็นความคิดเห็นของคุณ
stackPusher

str เป็นชื่อตัวแปรหรือเป็นกุญแจที่ฉันสามารถใช้ที่นี่ได้string aString(someChar);หรือไม่
Driss Bounouar

31

มีปัญหาเล็กน้อยในคำตอบที่ได้รับการโหวต กล่าวคืออาร์เรย์อักขระอาจมี 0 หากเราจะใช้ตัวสร้างกับพารามิเตอร์เดียวตามที่อธิบายไว้ข้างต้นเราจะสูญเสียข้อมูลบางส่วน ทางออกที่เป็นไปได้คือ:

cout << string("123\0 123") << endl;
cout << string("123\0 123", 8) << endl;

ผลลัพธ์คือ:

123
123 123


2
นี่เป็นคำตอบที่ดีกว่าถ้าคุณใช้std::stringเป็นที่เก็บข้อมูลไบนารีและไม่แน่ใจว่าอาร์เรย์นั้นไม่มี '\ 0'
Assil Ksiksi

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

using namespace std;

int main ()
{
  char *tmp = (char *)malloc(128);
  int n=sprintf(tmp, "Hello from Chile.");

  string tmp_str = tmp;


  cout << *tmp << " : is a char array beginning with " <<n <<" chars long\n" << endl;
  cout << tmp_str << " : is a string with " <<n <<" chars long\n" << endl;

 free(tmp); 
 return 0;
}

ออก:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long

ฟรี (tmp) อยู่ที่ไหน สายจะดูแลที่?
husey tugrul buyukisik

1
คำถามที่ดี. ฉันคิดว่าควรให้บริการฟรีเพราะฉันใช้ malloc
Cristian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.