Hỏi đáp
Chia sẻ kiến thức, cùng nhau phát triển
cout << p << endl; // Ket qua: simple string
cout << text << endl; // Ket qua: This is a simple string
int32_t match_index = (p - text); // Tai sao simple string- This is a simple string = 10
Anh giải thích giúp em với ạ...Tks a nhiều :))
à sau khi kiểm tra 1 lúc thì mình tháy như thế này: đầu tiên là sao kết quả lại bằng 10???
- 10 ở đây là độ dài của chuỗi "This is a ". Ta biết cái mảng text thì các phần tử của nó dkd sắp xếp liên tục. mình ví dụ chứ T ở đây là 23645 thì chữ h sẽ là 23646 chữ i sẽ là 23647 ..... chữ s(bắt đầu chữ simple ý) sẽ là 23655. và khi ta trừ đi thì nó sẽ là 10 thôi.
à kiến thức c này. ta có 1 mảng A[] thfi con trỏ A sẽ trỏ vào phàn tử đầu tiên của mảng.
Ở bài trên con trỏ p sẽ trỏ vào chữ s (của simple) và nó sẽ có địa chỉ là 23655 khi đó trừ đi con trỏ của T tức là text ý là 23645 thì sẽ dkd 10.
Sở dĩ mình nói ở p trỏ lun vào phần tử s(của từ simple) vì khi mình test cái này:
#include <iostream>
#include <cstring>;
using namespace std;
int main()
{
char text[] = "This is a simple string";
char B[] = "simple";
char *p = strstr(text, B);
text[10] = 'a';
text[11] = '\0';
cout << p << endl; // Ket qua: simple string
cout << text << endl; // Ket qua: This is a simple string
cout<< p<< " "<< text<<endl;
int match_index = (p - text); // Tai sao simple string- This is a simple string = 10
cout << match_index;
return 0;
}
ta thấy thay đổi mỗi text mà p cũng thay đổi theo kìa.
và lại khi ta xem chức năng hàm strstr thì nó cũng nói là trả về con trỏ chứ k có tạo ra chuỗi mới. con trỏ ở đây chính là địa chỉ của kí tự bắt đầu trên mảng text. hoàn toàn k có chuỗi nào mới dkd hình thành. Thân.
text kiểu char* (char[] là char*), p cũng kiểu char*, nên (p - text) là kiểu char*
int32_t match_index = (p - text); // convert từ char* sang int32_t, do không có mất dữ liệu nên tự động convert (implicit convert)
có thể kết quả của p - text thì cái string hay char kết quả của nó có mã ASCII = 10