Xin trợ giúp về hàm REVERSE C++

Cho em hỏi bài viết hàm reverse đảo ngược xâu em viết như này sai ở đâu ạ??
Chạy thì nó ra là “olllo” chứ không phải “olleh” như mong muốn ạ!

#include <iostream>
#include <cstring>
using namespace std;

void reverse (char *s) {
    int n = strlen(s);
    int i = 0;
    char *tmp = s;
    while (n != 0) {
        *(s+i) = *(tmp + n - 1);
        n--;
        i++;
    }
}
int main() {
    char s[] = "hello";
    reverse(s);
    cout << s;
    return 0;
}

Bạn gán thế này thì stmp chả khác gì nhau, dùng s cũng thế, mà dùng tmp cũng vậy.
Việc bạn thực hiện không phải là đảo chuỗi mà là ghi đè chuỗi.
Có gán qua gán lại thì mới là đảo, bạn gán chỉ 1 chiều thì ghi đè mất rồi.

tmp = a;
a = b;
b = tmp;
5 Likes

Mình viết như này thì nó vẫn ra là “hello” ạ

void reverse (char *s) {
    int n = strlen(s);
    int i = 0;
    while (n != n/2) {
        char k = *(s + i);
        *(s + i) = *(s + n - 1);
        *(s + n - 1) = k;
        i++;
        n--;
    }
}

Lặp nửa chuỗi thôi bạn.
Lý thuyết thì bạn đã là đúng, nhưng bạn có nhận ra vấn đề ở đoạn n != n/2 không? n chạy đến 0 mới dừng => lặp cả chuỗi.

int h = n/2;
while(n != h)
...
4 Likes

Mình cảm ơn ạ. Chương trình chạy thành công rồi :v

Tôi đã đọc về cách giải quyết cho vấn đề hiện tại, tôi đã tự đạt ra câu hỏi vấn đề có thực sự được giải quyết không?

Quay lại câu hỏi ban đầu:

Vấn đề sai là do câu lệnh sau: char* tmp =s;=> việc này có nghĩa tmp và s sử dung chung 1 địa chỉ ( bộ nhớ)

solve: khai báo tmp rồi coppy dữ liệu từ s vào ( có thể sử dụng for() hoặc memcpy)

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