Làm sao để nối 2 xâu có kí tự trống!

a chị giúp e với ạ. e dùng strcat() mà không được

1 Like

Em cho ví dụ cụ thể được không? anh nghĩ strcat làm tốt mà?

không hiểu vì cái phần mềm hay code mà lúc được lúc không a à. cái bài tìm kí tự (lần này là xâu có dấu cách) và số lần xuất hiện em sửa bài lúc nãy thành thế này

#include <iostream>
#include <string>
#include <windows.h>
#include <stdio.h>
using namespace std;
typedef struct{
	char kitu;
	int solan;
}word;
int search(char s, char *a){
	int t = strlen(a) - 1;
	for (int i = 0; i <= t; i++){
		if (s == a[i]) return 1;
	}
	return 0;
}
int menu(){
		int bai;
		system("cls");
		cout << "o.dung lai"<<endl;
		cout << "1.Tim X = {x thuoc S1 hoac x thuoc S2}" << endl;
		cout << "2.Tim X = {x thuoc S1 va x thuoc S2}" << endl;
		cout << "3.Tim X = {x thuoc S1 va x khong thuoc S2}" << endl;
		cout << "4.Tim tap ky tu va so lan xuat hien moi ky tu trong ca S1, S2 (Không ke ky tu trong)" << endl;
		cout << "5.Tim tap ky tu va so lan xuat hien moi ky tu thuoc ca S1, S2 (Không ke ky tu trong)" << endl;
		cout << "6.Tim tap ky tu va so lan xuat hien moi ky tu thuoc S1 nhung khong thuoc S2 (Không ke ky tu trong)" << endl;
		cout << "7.ma hoa x bang ky thuat chan le" << endl;
		cout << "8.giai ma x bang ky thuat chan le" << endl;
		cout << "9.tim tap tu va so lan xuat hien moi tu trong s1 hoac s2 " << endl;
		cout << "10.tim tap tu va so lan xuat hien moi tu trong s1 va s2" << endl;
		cout << "11.tim tap tu va so lan xuat hien moi tu trong s1 nhung khong xh trong s2" << endl;
		cout << "nhap bai: "; cin >> bai;
		return bai;
}
void tim_x_1()
{
    char a[20], b[20], c[20];
	cout << "nhap xau a: ";
	cin >> a;
	cout << "nhap xau b: ";
	cin >> b;
	strcat(a, b);
	int m = 0;
	for (int i = 0; i <= strlen(a); i++){
		if (search(a[i], c) == 0){
			c[m] = a[i];
			m++;
		}
	}
	for (int i = 0; i <= m - 1; i++) cout << c[i];
	cout<<endl;
	system("pause");
}

void tim_x_2()
{
    char a[20], b[20], c[20];
	cout << "nhap xau a: ";
    cin >> a;
    cout << "nhap xau b: ";
    cin >> b;
    int m = 0;
    for (int i = 0; i <= strlen(a) - 1; i++){
  	    if (search(a[i], b) == 1 && search(a[i], c) == 0){
	 	    c[m] = a[i];
		    m++;
	    }
    }
    for (int i = 0; i <= m - 1; i++) cout << c[i];
    cout<<endl;
        system("pause");
}

void tim_x_3()
{
    char a[20], b[20], c[20];
	cout << "nhap xau a: ";
	cin >> a;
	cout << "nhap xau b: ";
	cin >> b;
	int m = 0;
	for (int i = 0; i <= strlen(a) - 1; i++){
		if (search(a[i], b) == 0 && search(a[i],c)==0){
			c[m] = a[i];
			m++;
		}
	}
	for (int i = 0; i <= m - 1; i++) cout << c[i];
	cout<<endl;
    system("pause");
}

void tim_tap_ky_tu_4()
{
	word x[20];
	char d,a[20]="", b[20]="", c[20]="";
	cout << "nhap xau a: ";
	int i=0;
	fflush(stdin);
	do{
		d=getchar();
		a[i]=d;
		i++;
	}while(d != '\n');
	i=0;
	cout<<"nhap b ";
	fflush(stdin);
	do{
		d=getchar();
		b[i]=d;
		i++;
	}while(d != '\n');
	strcat(a,b);
	cout<<a;
	int m = 0;
	for (int i = 0; i <= strlen(a) - 1; i++){
		if (search(a[i], c) == 0){
			c[m] = a[i];
			x[m].kitu = a[i];
			x[m].solan = 1;
			m++;
		}
		else {
		for (int j = 0; j <= m - 1; j++){
			if (x[j].kitu == a[i]) x[j].solan++;
		}
	}
}
	for (int i = 0; i <= m - 1; i++){
		if(x[i].kitu!=' ') cout << "ki tu " << x[i].kitu << " xuat hien " << x[i].solan << " lan" << endl;
	}
	cout<<endl;
	system("pause");
}
int main()
{
    int tieptuc=1;
    do
    {
        switch(menu())
        {
        case 0:
            tieptuc = 0;
            break;
        case 1:
            tim_x_1();
            break;
        case 2:
            tim_x_2();
            break;
        case 3:
            tim_x_3();
            break;
        case 4:
            tim_tap_ky_tu_4();
            break;
        default:
            cout << "nhap loi\n";
            break;
        }
    }
    while(tieptuc);
}

ở cái bài 4 khi in ra thì em đã dùng

if(x[i].kitu!=' ')

thì mới in ra kí tự thế mà nó vẫn in ra cái dấu cách a à.

1 Like

Anh chưa có thời gian coi qua, nhưng khi em nói lúc được lúc không thì anh nghĩ là đoạn này em cần để ý

strcat(a,b);

câu lệnh này sẽ nối a vào b. Luôn phải đảm bảo chiều dài của mảng b đủ chứa cả b và a.

Mình không hiểu yêu cầu của đề bài lắm:

  • nếu yêu cầu là đếm số lần xuất hiện của 1 kí tự:
    int solan[256];
    fill(solan,solan+256,0);
    for(i=0->len(s)){
    solan[s[i]]++;
    }
  • Nếu đếm số lần xuất hiện kí tự cả 2 xâu:
    for(i=0->256){
    chung[i]=min(solan1[i],solan2[i]);
    }
    trong for 0<=i< cận trên
1 Like

chắc là do chiều dài của xâu không đủ a à. a xem hộ e cái lệnh in ra kí tự với. cái câu 4 em dùng lệnh

if(x[i].kitu!=' ') cout << "ki tu " << x[i].kitu << " xuat hien " << x[i].solan << " lan" << endl;

mà nó vẫn in ra kí tự dấu cách

đổi thành

if( ! isspace(x[i].kitu) )

Xem được không?

Mà đừng viết code trên 1 dòng, không chạy nhanh hơn. Ngắn hơn mà khó sửa lỗi hơn cũng thế à.

tại vì trên lớp thầy bất làm case study mà có bạn làm đến 1600 dòng thầy bảo làm gì mà dài thế nên toàn để 1 dòng

được rồi a ạ
a giải thích cho e tại sao

if(x[i].kitu!=' ')

thế này lại sai được ko

Cái này là do bạn đấy không chịu viết hàm. 1600 dòng bỏ vào vài hàm là ổn. Ai bảo bạn đấy bỏ vào trong cái case làm gì.

Tiết kiệm được bao nhiêu lắm đâu?

Em phải làm cái nào cho hiệu quả chứ, không nên viết dài, nhưng cũng không nên viết 1 dòng. Hãy chia code thành những nhiệm vụ nhỏ, tạo hàm để thực hiện nhiệm vụ đó. Như anh đã hướng dẫn trong bài trước.

Không ai chịu coi video của anh hết trơn :cry:, em coi video C 54, 55, 56 để hiểu nhé.

1 Like

em mới chỉ xem được mấy cái video của c++ chưa xem sang c

1 Like

I moved a post to a new topic: Video mã hóa xâu ký tự dùng kỹ thuật chẵn lẻ?

1 Like

có cái lỗi này nè a

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main(){
	char c,s[100],s1[100];
	cout<<"nhap s ";
	int j=0;
	do{
		c=getchar();
		s[j]=c;
		j++;
	}while(c !='\n');
        cout<<"nhap xau s1 ";
	do{
		c=getchar();
		s1[j]=c;
		j++;
	}while(c !='\n');
	strcat(s,s1);
	cout<<s;
}

em thử với s là: a a a
còn s1 là: b b b
thì kết quả s là:

a a a
¦(v¿?Yv¦b b b
v

Trước hết em có thể thay đoạn code này bằng

gets(s);

Bài này anh làm để hướng dẫn cho mọi người hiểu bản chất của việc nhập chuỗi.

Em sửa lại toàn bộ như sau

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
    char c,s1[100],s2[100];
    cout<<"nhap xau s1 ";
    fflush(stdin);
    gets(s1);
    cout<<"nhap xau s2 ";
    fflush(stdin);
    gets(s2);
    strcat(s1,s2);
    cout<<s1;
}

nhưng mà trước cấu gets(s) phải có fflush(stdin) nếu không thì nó sẽ không nhập chuỗi s mà chỉ nhập chuỗi s1 thoi a à

1 Like

À quên, nhớ thêm fflush(stdin) để tránh bị lỗi kiểu đấy :slight_smile:

Đã sửa

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