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

c

(Đặng Huỳnh Anh) #1

Đ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\n",i,i,i);
    }
}
int main(){
    hello();
    return 0;
}

(Luong Tran) #2

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) #3

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) #4

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) #5

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) #6

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


(rogp10) #7

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) #8

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


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