129

Câu hỏi này đã có câu trả lời ở đây:

Ví dụ, tôi có cái này

char *buff = "this is a test string";

và muốn có được "test". Làm thế nào tôi có thể làm điều đó?

|
198
char subbuff[5];
memcpy( subbuff, &buff[10], 4 );
subbuff[4] = '\0';

Công việc hoàn thành :)

|
  • 1

    Điều này sẽ lãng phí bộ nhớ. Bạn đa được cảnh bao! : P

    – Tạ Thanh Hồng 19:00:32 11/11/2013
  • 1

    @alexandernst: Chính xác như thế nào? 5 byte được phân bổ trên ngăn xếp (sẽ được giải phóng khi nó rơi ra khỏi phạm vi) hầu như không lãng phí bộ nhớ ...

    – Trinh Phương 21:38:21 11/11/2013
  • 1

    Vẫn còn nhiều hơn những gì bạn cần, nhưng vâng, họ sẽ được miễn phí ngay khi mã rời khỏi ngăn xếp hiện tại.

    – Hoàng Thiên Ðức 21:39:53 11/11/2013
  • 1

    @alexandernst: Vấn đề là bạn không thể làm gì nhiều với dữ liệu chuỗi đó mà không sao chép nó. Nếu bạn lấy một con trỏ đến phần từ chuỗi gốc, bạn cần biết độ dài vì nó sẽ không có dấu kết thúc null (Không ảnh hưởng đến chuỗi gốc).

    – Hồ Nghĩa Dũng 06:56:01 12/11/2013
  • 1

    Đừng quên #include <string.h>.

    – Hoàng Mỹ Trang 04:03:21 18/01/2014
80

Giả sử bạn biết vị trí và độ dài của chuỗi con:

char *buff = "this is a test string";
printf("%.*s", 4, buff + 10);

Bạn có thể đạt được điều tương tự bằng cách sao chép chuỗi con sang đích bộ nhớ khác, nhưng không hợp lý vì bạn đã có nó trong bộ nhớ.

Đây là một ví dụ tốt về việc tránh sao chép không cần thiết bằng cách sử dụng con trỏ.

|
  • 1

    @procrastinator: Không thực sự chỉ để in. Đây là một cách tiếp cận khả thi trong trường hợp chuỗi con sẽ không được sửa đổi. Bằng cách này, bạn chỉ cần giữ một cặp con trỏ thay vì phân bổ bộ đệm có độ dài thay đổi.

    – Vũ Quang Minh 07:19:25 07/10/2015
  • 1

    Nice one in chỉ xin lỗi nếu bạn đã cho tôi sai, tôi có nghĩa là giải pháp của bạn không đòi hỏi một chuỗi thêm, đó là hoàn hảo khi bạn chỉ cần in :-)

    – Hoàng Thịnh Cường 05:12:14 08/10/2015
  • 1

    sử dụng sprintf để lưu trữ chuỗi được định dạng ở trên

    – Hoàng Mộng Lâm 18:53:12 09/08/2016
  • 1

    @ParnabSanyal làm thế nào tôi có thể sử dụng sprintf để lưu trữ chuỗi con? Tôi có cần vượt qua độ dài chuỗi con làm tham số thứ ba không?

    – Trịnh Duy Hiền 14:56:58 11/11/2018
  • 1

    @VermaAman không bạn không. Đối số đầu tiên của bạn sẽ là chuỗi kết quả, đối số thứ hai sẽ là chuỗi nguồn và nếu bạn có trình giữ chỗ bên trong đối số thứ hai như %c, %iv.v. thì từ đối số thứ ba cho đến số lượng giữ chỗ, sẽ là giá trị thực của trình giữ chỗ (được phân tách bằng dấu phẩy) . Giống nhưprintf

    – Đặng Khánh Bình 15:13:26 11/11/2018
60

Sử dụng char* strncpy(char* dest, char* src, int n)từ <cstring>. Trong trường hợp của bạn, bạn sẽ cần sử dụng mã sau đây:

char* substr = malloc(4);
strncpy(substr, buff+10, 4);

Tài liệu đầy đủ về strncpychức năng ở đây .

|
9

Bạn có thể sử dụng strstr. Mã ví dụ ở đây

Lưu ý rằng kết quả trả về không phải là kết thúc null.

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.