Hỏi về con trỏ trong mảng kí tự

E chạy thử chương trình trích chuỗi từ một vị trí cho trước của chuỗi gốc mà nó không ra kết quả mọi người ạ. Vấn đề ở chỗ *(t++) í, mà tại sao thì e ko hiểu

#include <iostream>
using namespace std;
int main(){
	char *s="Hello world!", *t;
	t= new char [50];
	for (int i=2; i<8; i++){
		*(t++)=*(s+i);
	}
	*(t+6)='\0';
	cout << t;
	delete[] t;
}

E cảm ơn ạ.

Do con trỏ t sau khi thoát khỏi vòng lặp thì đang nằm ở cuối chuỗi bạn vừa tách. Có phải là t++ thì nó sẽ tăng dần không?
Cách sửa:

#include <iostream>
using namespace std;
int main(){
	char *s="Hello world!", *t;
	t= new char [50];
	for (int i=2; i<8; i++){
		*(t++)=*(s+i); // <==
	}
	*(t)='\0'; // <==
	t-=6; // <== Đưa con trỏ về đúng vị trí đầu tiên.
	cout <<t;
	delete[] t; // Nếu t bị thay đổi sai với vị trí ban đầu sẽ có lỗi khi gọi đến free().
}
#include <iostream>
using namespace std;
int main(){
	char *s="Hello world!", *t;
	t= new char [50];
	for (int i=2; i<8; i++){
		*(t+i-2)=*(s+i); // Không thay đổi giá trị của t.
	}
	*(t+6)='\0';
	cout << t;
	delete[] t;
}

Nếu bạn chỉ muốn tìm hiểu về con trỏ thì được. Nhưng không khuyến khích dùng kiểu char khi thao tác với chuỗi trong C++, thư viện <string> đã hỗ trợ đủ.
Nên chú ý khi dùng toán tử ++--.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?