ฉันจำเป็นต้องใช้ในการจัดเก็บข้อมูลที่ดึงมาจากstd::string
fgets()
ในการทำเช่นนี้ฉันต้องแปลงchar*
ค่าส่งคืนจากfgets()
เป็นstd::string
เก็บในอาร์เรย์ สิ่งนี้สามารถทำได้?
ฉันจำเป็นต้องใช้ในการจัดเก็บข้อมูลที่ดึงมาจากstd::string
fgets()
ในการทำเช่นนี้ฉันต้องแปลงchar*
ค่าส่งคืนจากfgets()
เป็นstd::string
เก็บในอาร์เรย์ สิ่งนี้สามารถทำได้?
คำตอบ:
std::string
มีตัวสร้างสำหรับสิ่งนี้:
const char *s = "Hello, World!";
std::string str(s);
โปรดทราบว่าสิ่งปลูกสร้างนี้จะคัดลอกรายชื่ออักขระที่s
และs
ไม่ควรเป็นnullptr
อย่างอื่นมิฉะนั้นพฤติกรรมจะไม่ได้กำหนด
str
เป็นเพียงชื่อตัวแปร มันอาจจะเป็นอะไรที่: S
, abc
, l
, ,I
strHelloWorld
เห็นได้ชัดว่าตัวเลือกบางอย่างดีกว่าตัวเลือกอื่น แต่สำหรับตัวอย่างstr
นี้ค่อนข้างยอมรับได้
หากคุณรู้ขนาด char * แล้วให้ใช้สิ่งนี้แทน
char* data = ...;
int size = ...;
std::string myString(data, size);
สิ่งนี้ไม่ได้ใช้ strlen
แก้ไข: หากตัวแปรสตริงมีอยู่แล้วให้ใช้ assign ():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
ส่วนใหญ่พูดถึงคำตอบเกี่ยวกับการก่อสร้าง std::string
ถ้าสร้างแล้วเพียงแค่ใช้ประกอบการที่ได้รับมอบหมาย
std::string oString;
char* pStr;
... // Here allocate and get character string (e.g. using fgets as you mentioned)
oString = pStr; // This is it! It copies contents from pStr to oString
ฉันต้องการใช้ std :: string เพื่อเก็บข้อมูลที่ถูกเรียกใช้โดย fgets ()
ทำไมต้องใช้fgets()
เมื่อคุณเขียนโปรแกรม C ++ ทำไมstd::getline()
ล่ะ
ส่งผ่านเข้าไปใน Constructor:
const char* dat = "my string!";
std::string my_string( dat );
คุณสามารถใช้ฟังก์ชั่น string.c_str () เพื่อไปทางอื่น:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
ผลตอบแทนconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
char* data;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;
ฉันต้องการจะพูดถึงวิธีการใหม่ที่ใช้ตัวอักษรที่กำหนดโดยผู้ใช้ s
ผมอยากจะพูดถึงวิธีการใหม่ซึ่งใช้ตัวอักษรที่ผู้ใช้กำหนดนี่ไม่ใช่เรื่องใหม่ แต่มันจะเป็นเรื่องธรรมดามากกว่าเพราะมันถูกเพิ่มเข้าไปใน C ++ 14 Standard Library
ฟุ่มเฟือยส่วนใหญ่ในกรณีทั่วไป:
string mystring = "your string here"s;
แต่มันช่วยให้คุณใช้ auto ได้เช่นกัน
auto mystring = U"your UTF-32 string here"s;
และนี่คือที่ที่มันส่องแสง:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
ฉันเพิ่งดิ้นรนกับ MSVC2005 เพื่อใช้ตัวstd::string(char*)
สร้างเช่นเดียวกับคำตอบที่ติดอันดับยอดนิยม เมื่อฉันเห็นตัวแปรนี้อยู่ในรายการ # 4 บนhttp://en.cppreference.com/w/cpp/string/basic_string/basic_stringฉันเชื่อถือได้เสมอฉันคิดว่าคอมไพเลอร์เก่ามีสิ่งนี้
ฉันใช้เวลานานมากที่จะตระหนักว่าตัวสร้างนี้ปฏิเสธที่จะจับคู่กับ(unsigned char*)
การโต้แย้ง! ฉันได้รับข้อความแสดงข้อผิดพลาดที่เข้าใจไม่ได้เกี่ยวกับความล้มเหลวในการจับคู่กับstd::string
ประเภทอาร์กิวเมนต์ซึ่งไม่ใช่สิ่งที่ฉันต้องการ เพียงแค่ทำการโต้แย้งด้วยการstd::string((char*)ucharPtr)
แก้ไขปัญหาของฉัน ... duh!
char* data;
std::string myString(data);
data
ยังคงค่าเริ่มต้น (ว่าง)
ไม่แน่ใจว่าทำไมไม่มีใครนอกจากเอริคพูดถึงเรื่องนี้ แต่ตามหน้านี้ผู้ประกอบการที่ได้รับมอบหมายทำงานได้ดี ไม่จำเป็นต้องใช้ Constructor, .assign () หรือ. append ()
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(และ+=
) ดูเหมือนจะไม่เกิดขึ้นกับตัวอักษรแบบนี้ แต่มี แต่char*
สิ่งต่าง ๆ ปัญหาที่ว่ารายงานดังกล่าวนั้นรั่วไหลจริง ๆจะกล่าวถึงที่นี่หรือไม่ แต่ถ้าฉันเปลี่ยนการมอบหมายให้destString = std::string(srcCharPtr);
กับรายงานการรั่วไหลของ valgrind ก็หายไป YMMV
Constructs an object of class basic_string and determines its initial string value from the array
0.9 มันบอกว่ามีคุณค่าและไม่มีอะไรเกี่ยวกับบัฟเฟอร์หรือความเป็นเจ้าของตัวชี้