Bạn có thể lưu trữ một chuỗi trong một mảng ký tự. Nhưng hãy nhớ rằng, nói chung, bạn không thể tìm ra độ lớn của một mảng bằng cách nhìn vào mảng, vì một mảng chỉ là một con trỏ tới đối tượng đầu tiên trong một đoạn bộ nhớ
Để tránh vấn đề khó chịu đó, chuỗi kết thúc null là một mảng ký tự bao gồm ký tự null ['\0'] làm dấu kết thúc. Ví dụ, một mảng s chứa năm ký tự
s[0] = 'g' s[1] = 'o' s[2] = 'a' s[3] = 't' s[4] = '\0'đại diện cho chuỗi "dê". Ký tự null không phải là một phần của chuỗi mà chỉ là một điểm đánh dấu cho bạn biết chuỗi kết thúc ở đâu
Bạn có thể chuyển một chuỗi kết thúc null cho một hàm mà không cần chuyển một kích thước riêng biệt, bởi vì hàm có thể tìm ra độ dài của chuỗi bằng cách tìm kiếm ký tự null
Hằng chuỗi
Một hằng chuỗi chẳng hạn như "một số văn bản" là một chuỗi kết thúc null. Vì vậy, nó là một mảng các ký tự, với ký tự null ở cuối
Hằng chuỗi có kiểu const char*. Ví dụ,
const char* flower = "lotus";biến điểm hoa vào vùng tĩnh của bộ nhớ, nơi lưu trữ chuỗi kết thúc null "sen"
Nếu bạn muốn bao gồm ký tự cuối dòng trong hằng chuỗi, hãy sử dụng \n. Hằng chuỗi không được phép có ngắt dòng thực sự trong đó. Nhưng nếu bạn viết hai hoặc nhiều hằng chuỗi trong một hàng, chúng sẽ tự động được kết hợp thành một hằng chuỗi. Ví dụ,
char* message = "This is a multiline\n" "message for you\n";tạo một hằng chuỗi có hai dòng
Ghi chú. Sự kết hợp của các chuỗi liên tiếp chỉ hoạt động đối với các hằng chuỗi, không hoạt động đối với các biểu thức khác đại diện cho các chuỗi
Hoạt động trên chuỗi kết thúc null
Những thứ sau đây khả dụng nếu bạn #include. Loại size_t tương đương với unsigned int
size_t strlen[const char* s]
strlen[s] trả về độ dài của chuỗi kết thúc null s. Độ dài không tính ký tự rỗng. Ví dụ: strlen["con thỏ"] = 6Ghi chú. strlen tìm độ dài bằng cách quét qua mảng để tìm ký tự null. Vì vậy, cần có thời gian tỷ lệ thuận với độ dài của chuỗi. Tránh tính toán lặp đi lặp lại [các] strlen cho cùng một chuỗi s trong cùng một hàm
int strcmp[const char* s, const char* t]
Không so sánh các chuỗi sử dụng ==. Nếu s và t có kiểu char* thì biểu thức s == t đúng nếu s và t là cùng một con trỏ. Nó không nhìn vào các ký tự trong chuỗiHàm strcmp so sánh các chuỗi s và t theo thứ tự bảng chữ cái hoặc bằng nhau. strcmp[s,t] trả về một số nguyên r với các thuộc tính sau
r < 0if s đứng trước tr = 0if s và t bằng nhau > 0 nếu c đứng sau Ví dụ: strcmp["cat", "cab"] > 0 vì "cat" đứng sau "cab" theo thứ tự bảng chữ cáiThứ tự chữ cái được xác định bởi mã ký tự. Vì 'Z' là 90 và 'a' là 97, nên Z đứng trước a theo thứ tự bảng chữ cái được sử dụng bởi strcmp
int strcasecmp[const char* s, const char* t]
char* strcpy[char* dest, const char* src];
strcpy[dest, src] sao chép chuỗi kết thúc null src vào mảng dest và dest kết thúc null. Người gọi phải đảm bảo rằng có đủ chỗ trong mảng dest cho toàn bộ chuỗi cộng với ký tự null ở cuốiGiá trị trả về của strcpy[dest, src] là dest
char* strncpy[char* dest, const char* src, size_t n];
Giống như strcpy[dest, src], nhưng mảng dest có kích thước n và không quá nhiều ký tự được sao chép. [Nếu không có chỗ trống, không có ký tự null nào được lưu trong dest. ]char* strcat[char* dest, const char* src];
Sao chép chuỗi src vào cuối chuỗi trong mảng dest, thêm ký tự null vào cuối. Sau đó trở về đíchHãy cẩn thận. strcat không phải là hàm nối. Ví dụ,
char* c = strcat[a,b];không chỉ đặt c thành nối của chuỗi a theo sau b. Nó thêm b vào cuối chuỗi trong mảng a. Vì vậy, những gì trong mảng a được thay đổi. Ngoài ra, phải có đủ chỗ để thêm b vào a. Strcat sẽ không phân bổ thêm phòng
C++ không phải là Java
char* strncat[char* dest, const char* src, size_t n];
char* strchr[const char* s, int c]
Trả về một con trỏ tới lần xuất hiện đầu tiên của ký tự c trong chuỗi kết thúc null s. Nếu không có ký tự nào như vậy, strchr[c, s] trả về NULLLoại strchr là loại kém. Vì tham số s có kiểu const char*, nên strchr sẽ không thể trả về một con trỏ không phải const cho s, vì điều đó cung cấp cho bạn một cách cửa sau để sửa đổi một chuỗi hằng số. Tuy nhiên, những người thiết kế thư viện thực sự muốn cung cấp hai chức năng khác nhau
const char* strchr[const char* s, int c]; char* strchr[char* s, int c];Đối với chương trình C, chương trình đó sẽ yêu cầu hai tên hàm khác nhau và điều đó có thể gây ra sự cố cho các chương trình kế thừa.
char* strstr[const char* đống cỏ khô, const char* kim]
Trả về một con trỏ tới lần xuất hiện đầu tiên của chuỗi con needle trong chuỗi haystack hoặc trả về NULL nếu không có. Cả đống cỏ khô và cây kim đều là các chuỗi vô hiệu.Ví dụ
Để minh họa, đây là cách triển khai strlen, strcmp và strncat. Việc triển khai strncat là từ trang hướng dẫn cho strncat. [Xem nó bằng cách thực hiện lệnh man strncat trong Linux. ]
size_t strlen[const char* s] { size_t k; for[k = 0; s[k] != '\0'; k++] {} return k; } int strcmp[const char* s, const char* t] { int k = 0; while[s[k] != '\0' && s[k] == t[k]] { k++; } // We want to return s[k] - t[k], but be // sure to treat the characters as numbers // from 0 to 255, not as numbers from // -128 to 127. int sk = [unsigned char] s[k]; int tk = [unsigned char] t[k]; return sk - tk; } char* strncat[char *dest, const char *src, size_t n] { size_t dest_len = strlen[dest]; size_t i; for [i = 0 ; i < n && src[i] != '\0' ; i++] { dest[dest_len + i] = src[i]; } dest[dest_len + i] = '\0'; return dest; }
Bài tập
strlen["ếch" + 1] là gì?
Hàm sau đây nhằm trả về một bản sao của chuỗi kết thúc null
char* copyString[const char* s] { char* t = new char[strlen[s]]; strcpy[t, s]; return t; }
Có một vấn đề nghiêm trọng với nó. Tại sao nó không hoạt động?Viết hàm trả về số lần xuất hiện của ký tự 'a' trong một chuỗi kết thúc null đã cho. Câu trả lời
Giả sử rằng numNonblanks[s] được cho là trả về số ký tự không trống trong chuỗi kết thúc null s. Nhìn vào định nghĩa sau đây của numNonblanks
int numNonblanks[const char* s] { int count = 0; for[int i = 0; i < strlen[s]; i++] { if[s[i] != ' '] { count++; } } return count; }
Định nghĩa đó không phải là một định nghĩa tốt lắm. Tại sao không?Viết một hàm removeBlanks[s] phân bổ không gian cho một chuỗi kết thúc null trong heap, sao chép tất cả các ký tự không trống trong chuỗi s kết thúc null vào không gian đó, kết thúc null mảng mới và trả về một con trỏ tới mảng đó. Không phân bổ nhiều phòng hơn mức cần thiết. Câu trả lời
Là chuỗi kết thúc bằng null?
Trong lập trình máy tính, chuỗi tận cùng bằng null là một chuỗi ký tự được lưu trữ dưới dạng một mảng chứa các ký tự và được kết thúc bằng ký tự null [ .Các chuỗi có thể rỗng trong Python không?
"null" là một chuỗi có giá trị "null" . Bạn đang tìm kiếm Không có hoặc '' , chuỗi trống? . Vì vậy, "null" chỉ là một chuỗi như bất kỳ chuỗi nào khác, nó khác với Không có.Làm thế nào chuỗi được kết thúc trong Python?
ký tự kết thúc chuỗi trong python .Không có ký tự kết thúc cho chuỗi trong python. Nếu bạn muốn in từng ký tự của chuỗi, bạn có thể sử dụng while [i < len[str]]. in str[i] i+=1. .@blunderboy cho c trong ch. in c. – kiro. .@Kiro Cảm ơn. Tôi chỉ muốn đề xuất một cách tiếp cận giống như C. – Sachin JainCác chuỗi UTF 8 có rỗng không
Chữ UTF8 phải được kết thúc bằng null. Các kịch bản tương tác sẽ muốn có một bộ kết thúc null. Tuy nhiên, họ có thể thêm một bằng cách thêm \0 vào cuối chuỗi và bộ phân tích có thể phát hiện những trường hợp này