01/10/2018, 16:10

Vấn đề về Swap character pointer trong hàm con trong C

Đoạn code ở dưới bị chạy infinite loop, tuy nhiên nếu sửa hàm “void hello()” vào hàm “main()” thì nó lại chạy.
Cho em hỏi lý do vì sao và cách sửa sao ạ?
Em xin cảm ơn!

#include <stdio.h>
 
void charSwap(char** a, char** b){
    char *c = *a;
         *a = *b;
         *b = c;
}
 
void hello(){
    char **a,**b;
    int i;
    printf("A = ");
    scanf("%c",&a);
    getchar();
    printf("B = ");
    scanf("%c",&b);
    getchar();
    if(a>b) charSwap(&a,&b);
    for (i=a;i<=b;i++)
    {
        printf("%c : %d , %X
",i,i,i);
    }
}
int main(){
    hello();
    return 0;
}
Luong Tran viết 18:20 ngày 01/10/2018

theo mình thấy, khi bạn dùng con trỏ thì ko nên dùng kiểu dữ liệu char,
vì con trỏ đã là một char ptr rồi
thay vào đó ta thay nó bằng kiểu như int …
khi mình thay char **a, bằng int **a thì chương trình chay bình thường

Đặng Huỳnh Anh viết 18:14 ngày 01/10/2018

Mình cảm ơn bạn đã replay, theo như đề bài tập là in ra các kí tự từ A - B (A và B là kí tự mình nhập).
Mình đã viết và chạy được.
Ví dụ: a đến d sẽ in ra a b c d . Nhưng mình đang muốn viết thêm 1 hàm nếu nhập từ d đến a thì nó vẫn in ra a b c d ạ!

rogp10 viết 18:21 ngày 01/10/2018

Swap hai biến thì cứ thêm một sao. Vậy bài này char một sao thôi.

(Thực ra nó ntn: code có một lỗi nặng là a và b không có mem!)

Đặng Huỳnh Anh viết 18:12 ngày 01/10/2018

Nếu xóa thành 1 * thì nó không chạy đâu.

 #include <stdio.h>
    void charSwap(char* a, char* b){
        char *c = *a;
             *a = *b;
             *b = *c;
    }
    void hello(){
        char a,b;
        char i;
        printf("A = ");
        scanf("%c", &a);
        getchar();
        printf("B = ");
        scanf("%c", &b);
        getchar();
        if(a>b) charSwap(&a,&b);
        for (i=a;i<=b;i++)
        {
            printf("\n%c : %d , %X",i,i,i);
        }
    }
    int main(){
        hello();
        return 0;
    }

Nếu ta sửa void hello() thành vầy thì trên https://ideone.com/v8XZwm chạy được tốt nhưng chỉ ở stdin.
Còn bình thường trên C sau khi complie thì nó in ra hết tất cả ascii.

void hello(){
    char a,b;
    char i;
    printf("A = ");
    scanf("%c", &a);
    //getchar();
    printf("B = ");
    scanf("%c", &b);
    //getchar();
    if(a>b) charSwap(&a,&b);
    for (i=a;i<=b;i++)
    {
        printf("\n%c : %d , %X",i,i,i);
    }
}
Đặng Huỳnh Anh viết 18:16 ngày 01/10/2018

Mình cảm ơn. Đây là cách tốt nhất! Cảm ơn bạn ^^

rogp10 viết 18:19 ngày 01/10/2018

Hàm swap của bạn có hai lỗi đấy. Lỗi thứ hai nằm ngay dòng đầu.

Đặng Huỳnh Anh viết 18:22 ngày 01/10/2018

mình chạy được rồi. Cảm ơn bạn! ^^

Bài liên quan
0