Hỏi về hàm chuỗi strncpy trong C++

#include <iostream>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
void TachLayTrai(char *strGoc, char *&strDau, char *&strSau);
void TachLayPhai(char *strGoc, char *&strCuoi, char *&strTRuoc);
int main(int argc, char** argv) {
	char *strGoc=new char[225];
	strcpy(strGoc,"Tran Chien Cong");
	char *strDau=new char[225];
	char *strSau=new char[225];
	TachLayTrai(strGoc,strDau,strSau);
	cout<<strDau<<endl;
	cout<<strSau<<endl;
	cout<<"----------------\n";
	char *strCuoi=new char[225];
	char *strTruoc=new char[225];
	strcpy(strCuoi,"");
	strcpy(strTruoc,"");
	TachLayPhai(strGoc,strCuoi,strTruoc);
	cout<<strCuoi<<endl;
	cout<<strTruoc<<endl;
	return 0;
}
void TachLayTrai(char *strGoc, char *&strDau, char *&strSau){
	//Tran Chien Cong
	char *p=strchr(strGoc,' ');
	
	int space=p-strGoc;
	strncpy(strDau,strGoc,space);
	p+=1;
	strSau=p;
}
void TachLayPhai(char *strGoc, char *&strCuoi, char *&strTruoc){
	// Tran Chien Cong
	int j=0;
	for (int i=strlen(strGoc);i>=0;i--){
		if (strGoc[i]==' '){
			j=i+1;
			break;
		}
	}
	int i2=0;
	for (int i=j;i<strlen(strGoc);i++){
		strCuoi[i2]=strGoc[i];
		i2++;
	}
	
	strncpy(strTruoc,strGoc,j-1 ); // HEREEEEEEEEEEEE
}

Cho em hỏi tại sao j-1 j-2 j-3 nó lại điền ký tự random vào ạ ??? . Em cảm ơn ạ.

1 Like

Một chuỗi trong C/C++ luôn được kết thúc bằng một ký tự kết thúc chuỗi ('\0').

Do đó sau mỗi lần strncpy() song thì bạn vẫn còn một việc nữa phải làm: Báo cho chương trình biết chuỗi này đã kết thúc.

Nếu không chuỗi của bạn cứ in ra từng ký tự cho đến khi gặp \0 thì thôi.

Sửa lại:

  • Trong function TachLayTrai(): thêm dòng :point_down:
      strncpy(strDau,strGoc,space);
      strDau[space] = '\0';  // Here
    
  • Trong function TrachLayPhai(): thêm hai dòng :point_down:
      for (int i = j; i < strlen(strGoc); i++) {
      	strCuoi[i2]=strGoc[i];
      	i2++;
      }
      strCuoi[i2] = '\0';  // Here
    
      strncpy(strTruoc,strGoc,j-1 );
      strTruoc[j - 1] = '\0';  // And here
    

À mà bạn nhớ delete những vùng nhớ đã cấp phát nha. :slight_smile:

4 Likes

em cảm ơn ạ ! :sunglasses::sunglasses::sunglasses::sunglasses::sunglasses:

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