xâu ký tự

Trong toàn bộ những lịch trình tất cả chúng ta đang được thấy cho tới giờ, tất cả chúng ta chỉ dùng những đổi thay loại số, chỉ dùng làm trình diễn những số. Nhưng ở kề bên những đổi thay loại số còn tồn tại những xâu kí tự động, bọn chúng được chấp nhận tất cả chúng ta trình diễn những chuỗi kí tự động như thể những kể từ, câu, đoạn văn bản… Cho cho tới giờ tất cả chúng ta mới mẻ chỉ sử dụng bọn chúng bên dưới dạng hằng chứ chứa chấp quan hoài cho tới những đổi thay hoàn toàn có thể chứa chấp bọn chúng.

Trong C++ không tồn tại loại dữ liệu cơ bản để lưu những xâu kí tự. Để hoàn toàn có thể thỏa mãn nhu cầu nhu yếu này, người tớ dùng mảng đem kiểu char. Hãy lưu giữ rằng loại tài liệu này (char) chỉ hoàn toàn có thể tàng trữ một kí tự động đơn, thế cho nên nó được dùng làm đưa đến xâu của những kí tự động đơn.

Bạn đang xem: xâu ký tự

Ví dụ, mảng sau (hay là xâu kí tự):

char jenny [20];

có thể lưu một xâu kí tự động với phỏng nhiều năm cực lớn là đôi mươi kí tự động. quý khách hàng hoàn toàn có thể tưởng tượng nó như sau:

Kích thước cực lớn này không cần thiết phải luôn luôn trực tiếp sử dụng cho tới. Ví dụ, jenny có thể lưu xâu “Hello” hoặc “Merry christmas”. Vì những mảng kí tự động hoàn toàn có thể lưu những xâu kí tự động ngắn thêm phỏng nhiều năm của chính nó, nhập C++ đang được mang trong mình 1 quy ước nhằm kết cổ động một nội dung của một xâu kí tự tại một kí tự động null, hoàn toàn có thể được viết lách là ‘\0’.

Chúng tớ hoàn toàn có thể biểu diễn jenny (một mảng đem đôi mươi thành phần kiểu char) Lúc tàng trữ xâu kí tự “Hello” và “Merry Christmas” theo cơ hội sau:

Chú ý rằng sau nội dung của xâu, một kí tự động null (‘\0’) được dùng làm báo hiệu kết cổ động xâu. Những dù color xám trình diễn những độ quý hiếm ko xác lập.

Khởi tạo nên những xâu kí tự

Vì những xâu kí tự động là những mảng thông thường nên bọn chúng cũng giống như các mảng không giống. Ví dụ, nếu như tất cả chúng ta ham muốn khởi tạo nên một xâu kí tự động với những độ quý hiếm xác lập tất cả chúng ta hoàn toàn có thể thực hiện vấn đề này tương tự động như với những mảng khác:

char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

Tuy nhiên, tất cả chúng ta hoàn toàn có thể khởi tạo nên độ quý hiếm cho 1 xâu kí tự động bằng phương pháp khác: dùng các hằng xâu kí tự.

Trong những biểu thức tất cả chúng ta đang được dùng trong số ví dụ trong số chương trước những hằng xâu kí tự động nhằm xuất hiện tại vài ba phen. Chúng được trình diễn nhập cặp ngoặc kép ("), ví dụ:

"the result is: "

là một hằng xâu kí tự động tất cả chúng ta dùng ở một vài điểm.

Không tương tự vệt nháy đơn (‘) được chấp nhận trình diễn hằng kí tự động, cặp ngoặc kép (“) là hằng trình diễn một chuỗi kí tự động thường xuyên, và ở cuối chuỗi một kí tự động null (‘\0’) luôn luôn được tự động hóa thêm vô.

Vì vậy tất cả chúng ta hoàn toàn có thể khởi tạo nên xâu mystring theo một trong những nhì cơ hội sau đây:

char mystring [] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char mystring [] = "Hello";

Trong cả nhì tình huống mảng (hay xâu kí tự) mystring được khai báo với độ dài rộng 6 kí tự: 5 kí tự động biểu diễn Hello cộng với cùng một kí tự động null.

Trước Lúc nối tiếp, tôi rất cần được nhắc nhở chúng ta rằng việc gán nhiều hằng như việc dùng vệt ngoặc kép (“) chỉ hợp thức khi khởi tạo mảng, tức là khi khai báo mảng. Các biểu thức nhập lịch trình như:

mystring = "Hello";
mystring[] = "Hello";

là ko hợp thức, cả câu mệnh lệnh sau đây cũng vậy:

mystring = { 'H', 'e', 'l', 'l', 'o', '\0' };

Vậy hãy nhớ: Chúng tớ chỉ hoàn toàn có thể “gán” nhiều hằng cho 1 mảng nhập khi khởi tạo nên nó. vì sao là một trong những thao tác gán (=) ko thể nhận vế trái khoáy là cả một mảng tuy nhiên chỉ hoàn toàn có thể nhận một trong mỗi thành phần của chính nó. Vào thời gian khởi tạo nên mảng là một trong những tình huống quan trọng đặc biệt, vì thế nó ko thực sự là một trong những mệnh lệnh gán tuy vậy nó dùng vệt bởi (=).

Gán độ quý hiếm cho tới xâu kí tự

Vì vế trái khoáy của một mệnh lệnh gán chỉ hoàn toàn có thể là một trong những thành phần của mảng chứ không cần thể là cả mảng, tất cả chúng ta hoàn toàn có thể gán một xâu kí tự động cho 1 mảng kiểu char sử dụng một cách thức như sau:

mystring[0] = 'H';
mystring[1] = 'e';
mystring[2] = 'l';
mystring[3] = 'l';
mystring[4] = 'o';
mystring[5] = '\0';

Nhưng rõ nét trên đây ko cần là một trong những cách thức thực tiễn. Để gán độ quý hiếm cho 1 xâu kí tự động, tất cả chúng ta hoàn toàn có thể dùng loạt hàm kiểu strcpy (string copy), hàm này được khái niệm trong string.h và hoàn toàn có thể được gọi như sau:

Xem thêm: lâm áng tư

strcpy (string1, string2);

Lệnh này copy nội dung của string2 sang string1string2 có thể là một trong những mảng, con cái trỏ hoặc một hằng xâu kí tự, thế cho nên mệnh lệnh sau đấy là một cơ hội đích thị nhằm gán xâu hằng “Hello” cho mystring:

strcpy (mystring, "Hello");

Ví dụ:

// setting value đồ sộ string
#include <iostream.h>
#include <string.h>
 
int main ()
{
  char szMyName [20];
  strcpy (szMyName,"J. Soulie");
  cout << szMyName;
  return 0;
}

Để ý rằng tất cả chúng ta cần include file <string.h> để hoàn toàn có thể dùng hàm strcpy.

Mặc cho dù tất cả chúng ta luôn luôn hoàn toàn có thể viết lách một hàm giản dị và đơn giản như hàm setstring dưới trên đây nhằm triển khai một thao tác kiểu như như strcpy:

// setting value đồ sộ string
#include <iostream.h>
 
void setstring (char szOut [], char szIn [])
{
  int n=0;
  bởi {
    szOut[n] = szIn[n];
    n++;
  } while (szIn[n] != 0);
}
 
int main ()
{
  char szMyName [20];
  setstring (szMyName,"J. Soulie");
  cout << szMyName;
  return 0;
}

Một công thức thông thường sử dụng không giống nhằm gán độ quý hiếm cho 1 mảng là dùng thẳng dòng sản phẩm nhập tài liệu (cin). Trong tình huống này độ quý hiếm của xâu kí tự động được gán bởi người tiêu dùng nhập quy trình lịch trình triển khai.

Khi cin được dùng với những xâu kí tự động nó thông thường được sử dụng với phương thức getline của nó, công thức này hoàn toàn có thể được gọi như sau:

cin.getline ( char buffer[], int length, char delimiter = ' \n');

trong đó buffer (bộ đệm) là địa điểm điểm tiếp tục tàng trữ tài liệu nhập (như là một trong những mảng chẳng hạn), length là phỏng nhiều năm cực lớn của cục đệm (kích thước của mảng) và delimiter là kí tự động được dùng làm kết cổ động việc nhập, đem quyết định – nếu như tất cả chúng ta ko sử dụng thông số này – được xem là kí tự động xuống dòng sản phẩm (‘\n’).

Ví dụ tại đây tái diễn toàn bộ những gì chúng ta gõ bên trên keyboard. Nó đặc biệt giản dị và đơn giản tuy nhiên là một trong những ví dụ đã cho thấy chúng ta cũng có thể sử dụng cin.getline với những xâu kí tự động như vậy nào:

// cin with strings
#include <iostream.h>
 
int main ()
{
  char mybuffer [100];
  cout << "What's your name? ";
  cin.getline (mybuffer,100);
  cout << "Hello " << mybuffer << ".\n";
  cout << "Which is your favourite team? ";
  cin.getline (mybuffer,100);
  cout << "I lượt thích " << mybuffer << " too.\n";
  return 0;
}

Chú ý nhập cả nhì câu nói. gọi cin.getline chúng tớ dùng và một đổi thay xâu (mybuffer). Những gì lịch trình thực hiện nhập câu nói. gọi loại nhì giản dị và đơn giản là thay cho thế nội dung của buffer trong câu nói. gọi cũ bởi nội dung mới mẻ.

Nếu chúng ta còn lưu giữ phần nói đến tiếp xúc với, các bạn sẽ lưu giữ rằng tất cả chúng ta đang được dùng toán tử >> để nhận tài liệu thẳng từ trên đầu nhập chuẩn chỉnh. Phương thức này hoàn toàn có thể được sử dụng với những xâu kí tự động thay cho cho cin.getline. Ví dụ, nhập chươn trình của tất cả chúng ta, Lúc tất cả chúng ta ham muốn nhận tài liệu kể từ người tiêu dùng tất cả chúng ta hoàn toàn có thể viết:

cin >> mybuffer;

lệnh này tiếp tục thao tác làm việc như nó đem những giới hạn sau mà cin.getline không có:

  • Nó chỉ hoàn toàn có thể nhận những kể từ đơn (không cảm nhận được cả câu) vì thế công thức này dùng kí tự động trống(bao bao gồm cả vệt cơ hội, vệt tab và vệt xuống dòng) thực hiện tín hiệu kết cổ động..
  • Nó ko được chấp nhận hướng dẫn và chỉ định độ dài rộng cho tới cỗ đệm. Chương trình của chúng ta cũng có thể chạy tạm bợ nếu như tài liệu nhập to hơn kích thước của mảng chứa chấp nó.

Vì những nguyên vẹn nhân bên trên, Lúc ham muốn nhập nhập những xâu kí tự động chúng ta nên sử dụng cin.getline thay vì cin >>.

Chuyển thay đổi xâu kí tự động lịch sự những loại không giống.

Vì một xâu kí tự động hoàn toàn có thể trình diễn nhiều loại tài liệu khác ví như dạng số cho nên việc quy đổi nội dung như thế lịch sự dạng số là đặc biệt hữu ích. Ví dụ, một xâu hoàn toàn có thể đem giá chỉ trị “1977”nhưng cơ là một trong những chuỗi bao gồm 5 kí tự động (kể cả kí tự động null) và rất khó gì gửi trở thành một vài nguyên vẹn. Vì vậy thư viện cstdlib (stdlib.h) đang được cung ứng 3 macro/hàm hữu ích sau:

  • atoi: chuyển xâu trở thành kiểu int.
  • atol: chuyển xâu trở thành kiểu long.
  • atof: chuyển xâu trở thành kiểu float.

Tất cả những hàm này nhận một thông số và trả về độ quý hiếm số (int, long hoặc float). Các hàm này Lúc kết phù hợp với phương thức getline của cin là một cơ hội uy tín rộng lớn phương thức cin>> cổ điển Lúc đòi hỏi người tiêu dùng nhập vào một trong những số:

/ cin and ato* functions
#include <iostream.h>
#include <stdlib.h>
 
int main ()
{
  char mybuffer [100];
  float price;
  int quantity;
  cout << "Enter price: ";
  cin.getline (mybuffer,100);
  price = atof (mybuffer);
  cout << "Enter quantity: ";
  cin.getline (mybuffer,100);
  quantity = atoi (mybuffer);
  cout << "Total price: " << price*quantity;
  return 0;
}

Các hàm nhằm thao tác bên trên chuỗi

Thư viện cstring (string.h) không những đem hàm strcpy mà còn tồn tại nhiều hàm không giống nhằm thao tác bên trên chuỗi. Dưới đấy là ra mắt lướt qua loa của những hàm thông thườn nhất:

strcat:   char* strcat (char* dest, const char* src);

Gắn thêm thắt chuỗi src vào phía cuối của dest. Trả về dest.

strcmp:   int strcmp (const char* string1, const char* string2);

So sánh nhì xâu string1 và string2. Trả về 0 nếu nhì xâu là cân nhau.

strcpy:   char* strcpy (char* dest, const char* src);

Copy nội dung của src cho dest. Trả về dest.

Xem thêm: thế thân truyện

strlen:   size_t strlen (const char* string);

Trả về phỏng nhiều năm của string.

Chú ý: char* trọn vẹn tương tự với char[]

(Nguồn ThuvienIT)