30/09/2018, 17:09

[Hỏi] Hàm để tách chuỗi

Em đang làm thử hàm, trong đó, hàm này sẽ cắt 1 chuỗi bắt đầu từ vị trí pos mà mình nhập vào cho đến hết chuỗi lớn.
Sau đó gán chuỗi mới đó (em tạm gọi là subString).
Đây là code của em:

char* cut(char* str, int pos, char* subStr)
{
    char word;
    int index = 0;

    do{
        word = str[pos];
        subStr[index] = word;
        pos++; index++;
    }while(word != '');

    str[pos] = '';

    // return str;
}

int main()
{
    int time, pos = 5;
    char str[] = "Hello World";
    char subStr[] = "";

    cut(str, pos, subStr);

    std::cout << str << std::endl << subStr << std::endl;

    return 0;
}

Với vị trí 5, em muốn chuỗi chính sẽ bị cắt ra, thì output sẽ là:

str: "Hello"
subStr: " World"

Thế nhưng kết quả lại ra:

str: "World"
subStr: " World"

Sau khi debug thì em thấy ở cái dòng

subStr[index] = word;

Nó sẽ thay đổi luôn cả 2 chuỗi.

Có cách nào khắc phục cái này không ạ ?

... viết 19:18 ngày 30/09/2018

Try this

#include <iostream>
using namespace std;

char* substring(char* s,int pos)    {
    
    char* t = &s[pos];
    s[pos-1] = '\0';
    return t;
}

int main() {
    
    char s[50] = "hello world";
    
    char* t = substring(s,6);
    
    cout << s << endl;
    cout << t << endl;
    
    return 0;
}
Minh Hoàng viết 19:21 ngày 30/09/2018

bị mất 1 ký tự rồi…


@nhatlonggunz thử này xem. biến pos của em đã bị cộng dồn lên rồi.

#include <iostream>
using namespace std;
void cut(char *str, int pos, char *subStr)
{
	char word;
	int index = 0;
	int index2 =pos;
	do{
		word = str[index2];
		subStr[index] = word;

		index2++; 
		index++;
	}while(word !=  NULL);
	str[pos] = 0;
}

int main()
{
	int time, pos = 5;
	char str[] = "Hello World";
	char subStr[]="";

	cut(str, pos, subStr);

	std::cout << str << std::endl << subStr << std::endl;
	getchar();
	getchar();
	return 0;
}
Gió viết 19:18 ngày 30/09/2018

update : code không có lỗi nhưng có lẽ không khai báo kích thước nên đè bộ nhớ lên nhau

  • khai báo kích thước subStr nếu không sẽ bị lỗi
  • Đơn giản hơn

void subString(char *str, int pos, char* subStr){
      strcpy(subStr,str+pos);
      str[pos]=0;
}
nhatlonggunz viết 19:12 ngày 30/09/2018

Dạ cám ơn anh nhiều !!!

Mà mọi người cho em hỏi, tại sao lại có tình trạng như trên ạ ? Khi em gán subStr[index] = word ấy.

Mục đích của em là làm cái hàm tựa tựa strcpy ấy anh @Gio

Hic, có ai giải thích hộ em tại sao code của em gặp tình trạng trên không :’(
@ltd @Gio

Gió viết 19:16 ngày 30/09/2018
  • Thứ nhất là không khai báo bộ nhớ cho subStr cần thiết để chứa
    Kiểm tra
cout<<distance(subStr,str)<<endl; // => 1

khi đó độ dài của xâu subStr nếu thiếu thì sẽ tràn sang bộ nhớ của str.

  • Thứ hai là nếu khai báo đủ bộ nhớ thì thuật toán bị sai: vì khi đó pos sẽ chỉ đến cuối chuỗi, thay bằng 1 biến khác lưu vị trí của pos ban đầu
Bài liên quan
0