Thêm ngôi sao vào giữa các ký tự

Em viết chương trình thế này nhưng không biết nó sai chỗ nào mà không hiện ra kết quả ạ. mọi người chỉ giáo giúp em :((((((((((((((

#include <iostream>
using namespace std;

char* allStar(char* initialString){
    int dodai = 0; 
    while(initialString[dodai]!='\0')
    {
        dodai++;
    }
    
    char* string2;
    for(int i=0; i<dodai; i++)
    {
        string2[2*i]=initialString[i];    
        if(2*i+1<2*dodai) string2[2*i+1]='*';
    }
    return string2;
    
}

int main() {
    char* ten="abcconde";
    
    cout << allStar(ten);
	return 0;
}

Chưa cấp phát cho string2:smiley:

5 Likes

Cái phần string này em còn lan man quá, anh chỉ em với ạ.

Cấp phát cho string là char* string2[50]; thì nó bị lỗi invalid convert string to string*

Phải là

char *string2 = new char[50]

Và nhớ delete[] nữa. :slight_smile:

3 Likes

Úi, nó ra kết quả rồi, hay quá, nhưng mà hình như nó bị lỗi gì nữa đó, anh xem giúp em với :3

#include <iostream>
using namespace std;

char* allStar(char* initialString){
    int dodai = 0; 
    while(initialString[dodai]!='\0')
    {
        dodai++;
    }
    
    char* string2 = new char[dodai];
    for(int i=0; i<dodai; i++)
    {
        string2[2*i]=initialString[i];    
        if(2*i+1<2*dodai-1) string2[2*i+1]='*';
    }
    return string2;

    
}

int main() {
   char* ten = new char[50];
    ten = "abcconde";
    char *s2 = allStar(ten);
    cout << s2;
    delete[] s2;
    delete[] ten;
	return 0;
}

Dùng markdown đi bạn. :slight_smile:
Bọc code vô ba cái này nè `

    ```
    // code
    ```

Phải là delete[] chứ không phải là delete. Vì string2mảng ký tự.

Không thể delete[] string2 trong hàm allStar vì khi return nghĩa là đã thoát ra khỏi hàm rồi.

Phải gán nó vào một biến khác. Như này chẳng hạn.

char *s2 = allStart(ten);
cout << s2;
delete[] s2;
delete[] ten;

Và chỗ char *string2 = new char[50] bạn có thể sửa thành char *string2 = new char[dodai]. :slight_smile:

4 Likes

Mình đã sửa lại nhưng dường như nó vẫn bị lỗi cũ. Cảm ơn bạn đã sửa những lỗi sai của mình <3

Độ dài xâu nhân đôi :smiley: mà chưa tính kí tự kết thúc thì vẫn ko đc.

5 Likes

Em muốn giải bài toán này với điều kiện là không thêm ngôi sao vào giữa khoảng trắng
VD: tui moi hoc lap trinh -> t*u*i m*o*i h*o*c l*a*p t*r*i*n*h
em thực hiện function thế này nhưng không biết sai chỗ nào ạ, mọi người xem giúp em

char* allStar(char* initialString){
    int dodai = 0; 
    while(initialString[dodai]!='\0')
    {
        dodai++;
    }
    
    int khoangtrang=0;
    for(int i=0; i<dodai;i++)
    {
        if(initialString[i]==' ')
        khoangtrang++;
    }
    
    int trangmove=0;
    char* string2 = new char[dodai*2];
    for(int i=0; i<dodai; i++)
    {
        if(initialString[i]!=' ')
        {
            string2[2*i-trangmove]=initialString[i];
            if(2*i+1<2*dodai-2*khoangtrang-1) string2[2*i-2*trangmove]='*';
        }
        else if(initialString[i]==' ') 
        {
            trangmove++;
            string2[2*i-trangmove]=' ';
        }
    }
    return string2;
}

Như ví dụ ở trên là có 21 kí tự, trong đó có 4 khoảng trắng, vậy em tính ra là 21*2-4*2-1=33 vừa đúng với số ký tự khi thêm ngôi sao vô mà :((((

Nhưng string2 vẫn chứa cả * lẫn khoảng trắng.

Sao lại trừ đi. :thinking:

1 Like

Giữa 2 bên của khoảng trắng ko có thêm dấu sao nên trừ dấu sao không thêm vào ở đó í. Với lại khi run thử thì kết quả có 1 dấu sao còn chữ biến đâu hết

char *s = new char[maxSize]

Như kia nghĩa là s chỉ chứa tối đa maxSize - 1 ký tự có nghĩa (chừa một phần cho \0)

Vì độ dài của string2 tối đa thì là sẽ gấp đôi độ dài của initialString - 1.

Vậy nên để new char[dodai * 2] là hợp lý. :slight_smile:

2 Likes

Nhưng mà sửa cái đó xong thì output cũng hệt vậy luôn í, nó ko ra kết quả :frowning:

Bạn thử code dưới coi sao. :slight_smile:

#include <iostream>

char *allStar(char *s) {
    int len = 0;
    while (s[len] != '\0') len++;
    char *s2 = new char[len * 2];
    int j = 0;
    for (int i = 0; i < len; i++) {
        s2[j++] = s[i];
        if (s[i] != ' ' && s[i + 1] != ' ' && s[i + 1] != '\0') s2[j++] = '*';
    }
    s2[j] = '\0';
    return s2;
}

int main() {
    char s[] = "Viet Nam vo dich";
    char *s2 = allStar(s);
    std::cout << s2 << '\n';
    delete[] s2;
    return 0;
}
4 Likes

Cảm thấy lạnh người…

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