Đảo ngược chuỗi kí tự

đảo nguoc từ trong chuỗi ví dụ " mot hai ba" thành “ba hai mot”

Dùng ngôn ngữ gì vậy Kiệt? Nhưng về bản chất thì mình tách làm 3 chữ, lưu lại rồi sắp xếp ngược lại là được.

Mình move bài này sang bài mới nhé, vì khác chủ đề @Nguy_n_Trung_Ki_t
bài này thì mình chủ yếu dùng strtok để tách từ
sau đó mình sẽ dùng đệ quy hoặc duyệt để sắp xếp lại :smile: tùy bạn thôi

Chuyển sang python cho dễ học bạn ạ :joy:


result= ' '.join(reversed(s.split()))

5 Likes

Em xài devC anh Đạt :))

em định xài strtok để tách nó ra nhưng em không biết lưu nó ở đâu để xếp lại,em mới học chuỗi nên chưa có kinh nghiệm :disappointed_relieved:

Em dùng loop để lưu lại đi: http://www.cplusplus.com/reference/cstring/strtok/

Sau đó chèn vào đầu chuỗi output là được

hàm strtok trả về kiểu char đúng không anh Đạt

trả về địa chỉ của chuỗi kí tự :smile:

Thế này đã được chưa vậy???

void ReverseString(char str[])
{
	char str_new[255] = "";
	for(int i = strlen(str) - 1; i >= 0; i--)
		if(str[i] == ' ')
		{
			strncat(str_new, str + i + 1, strlen(str + i + 1));
			strcat(str_new, " ");
			str[i] = 0;
		}
		strcat(str_new,str);
		printf("%s\n", str_new);
}
1 Like

bạn cho mình hỏi cách dùng hàm strncat với

Đầu tiên bạn nên có 1 hàm dùng để tách từ từ 1 chuỗi rồi lưu nó vào mảng theo thứ tự tách từ trái qua phải. Sau đó bạn chỉ việc duyệt mảng sau khi tách từ cuối về đầu là OK thôi bạn.

mình không biết hàm tách từ :3

Đơn giản thôi bạn. Nếu bạn dùng các ngôn ngữ bậc cao như C#, Java, … thì bạn chỉ cần gọi hàm Split(" "); của chuỗi đó là nó sẽ trả về cho bạn 1 mảng các phần tử là các từ của bạn.

Nếu bạn dùng các ngôn ngữ bậc thấp hơn mà không có hàm sẵn thì bạn tự viết ra nó cũng khá dễ.
Đầu tiên bạn chỉ cần duyệt chuỗi đó như 1 mảng char các ký tự và cứ đến khi gặp ký tự space thì bạn có thể lưu chỉ số (index) của ký tự space đó và từ đó tách được các từ thôi.

1 Like

ý là mình o biết tách thế nào ấy,ví dụ muốn cắt trong chuỗi từ vị trí thứ a den vị trí thu b có hàm nào ko,chứ ý tưởng thì mình nghĩ ra dc

Ví dụ trong C thì string là 1 mảng char nên chỉ cần duyệt từ vị trí a tới vị trí b và lưu nó ra 1 chuỗi khác thôi.

Bài này mình nghĩ không cần mảng phụ hay tách ra gì cả. Chỉ cần đảo từng từ, sau đó đảo cả chuỗi thì ra kq thôi :smile: Code tham khảo

#include <stdio.h>

#include <string.h>

void reverse(char * s,int begin,int end){
    int i,len=end-begin+1;
    char t;
    for(i=0; i<len/2;i++){
        t=s[begin+i];
        s[begin+i]=s[end-i];
        s[end-i]=t;
    }
}

void rev(char* s){
    int i,begin;

    while(s[i]){
        if(s[i]==' ') i++;
        else{
            begin=i;
            while(isalnum(s[i])){
                 i++;
            }
            reverse(s,begin,i-1);
        }
    }
    reverse(s,0,i-1);
}
int main() {
	char s[]="mot hai ba ";
        rev(s);
        puts(s);
	return 0;
}

3 Likes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) 
{
	char s[100];
	char *p;
	char **a;
	printf("Nhap chuoi:");
	fflush(stdin);
	gets(s);
	int j,i=0;
	p=strtok(s,' ');
	while(p!=NULL)
	{
		a[i]=p;
		i++;
		p=strtok(NULL,' ');
	}
	printf("Chuoi sau khi dao:\n");
	for(j=i;j>i;j--)
	{
		printf("%s ",a[i]);
	}
	return 0;
}

mọi người xem dùm code mình sai chỗ nào sao chạy không ra :3

j chạy từ i-1 -> 0 :joy: , char ** a=> char* a[100]; chẳng hạn

1 Like

van ko ra :3 hichic,haiz

Code đệ quy để vọc chơi :smiley:

#include <stdio.h>
#include <string.h>
void	reverse_recursion(char* p)
{
	if (p!=NULL)
	{	
		reverse_recursion(strtok(NULL," "));
		printf("%s ",p);
	}
}
int main()
{
	char a[]="mot hai ba bon nam";
	char* p=strtok(a," ");
	reverse_recursion(p);
	getchar();
	getchar();
	return 0;
}
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?