Các chuỗi Python có bị chấm dứt không

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ỏ"] = 6

Ghi 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ỗi

Hà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ái

Thứ 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]

Giống như strcmp, nhưng bỏ qua trường hợp của các chữ cái. Vì vậy, 'r' và 'R' được coi là cùng một ký 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ối

Giá 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ề đích

Hã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];

Giống như strcat[dest, src], nhưng nhiều nhất n ký tự được sao chép từ src.

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ề NULL

Loạ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

  1. strlen["ếch" + 1] là gì?

  2. 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?
  3. 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

  4. 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?
  5. 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 Jain

    Cá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

Chủ Đề