30/09/2018, 23:32

Không hiểu điều gì đang diễn ra với đoạn code C. Nhờ các bác giải thích giùm!

Các bác chỉ giúp em tại sao Lặp với while() trong hàm main() lại chỉ in ra nội dung của struct cuối cùng, còn lặp “bằng tay” thì lại in “đúng” không ạ?
Em chẳng thể tìm ra lỗi ở đâu. có khi gần 2h rồi

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma pack(1)


typedef struct island
{
      char *name;
      char *open;
      char *close;
      struct island *next;
}island;

void display(island *start)
{
    island *i = start;
    for (;i != NULL  ; i = i->next )
    {
        if( i->next != NULL)
            printf("Island name: %s, Open: %s, Close: %s, Next island: %s
", i->name, i->open, i->close, (i->next->name) );
        else
            printf("Island name: %s, Open: %s, Close: %s, Next island: %s
", i->name, i->open, i->close, i->next);
    }

}
void addIsland(island* nI, island* start )
{
    island *i = start;

    for (;i != NULL  ; i = i->next )
    {
        if(i->next == NULL)
        {
            i->next = nI;
            return;
        }

    }
}

island * create(char* name)
{
    island * i = malloc(sizeof(island));
    i->name = name;
    i->open = "09:15";
    i->close ="17:30";
    i->next = NULL;
    return i;
}

int main()
{

    island amity = {"Amity", "09:00", "17:15", NULL};  


    char newName[100];
    island* new_island = NULL;
    int n = 0;
    printf("
 Lap voi While: 
");
    while(n < 4)
    {
        printf("

");
        sprintf(newName,"%d", n); // Convert biến
        new_island = create(newName);
        addIsland(new_island, &amity);
        display(&amity);
        n++;                        // Tự động thay tên biến

    }
     printf("
 lap bang tay: 
");
    {  // Lặp bằng tay :))

        printf("

");
        new_island = create("0");
        addIsland(new_island, &amity);
        display(&amity);

        printf("

");
        new_island = create("1");
        addIsland(new_island, &amity);
        display(&amity);

        printf("

");
        new_island = create("2");
        addIsland(new_island, &amity);
        display(&amity);

        printf("

");
        new_island = create("3");
        addIsland(new_island, &amity);
        display(&amity);
    }


    return 0;
}
anon45952904 viết 01:40 ngày 01/10/2018

Mình đang “ngâm” thì lại đẻ ra 1 câu hỏi nữa:

Nếu là pointer name khi mang địa chỉ đi share cho khắp nơi mỗi khi hàm island * create(char* name) được gọi là 1 lỗi. Do name không được cấp phát địa chỉ và bộ nhớ riêng mà chỉ dùng 1 địa chỉ để share ( đúng ko ta? ). Thì tại sao gọi cùng hàm trong while() và ngoài while() lại cho kết quả khác nhau dữ vậy???

Trọng Nghĩa viết 01:45 ngày 01/10/2018

Bạn thử cấp phát lại xem, khi khai báo ấy:
island* new_island = new island;

Nguyen Ca viết 01:35 ngày 01/10/2018

sprintf(newName,"%d", n);

printf cái này ra là biết. sao không gán trực tiếp luôn?

anon45952904 viết 01:37 ngày 01/10/2018

new ở trong thư viện nào của C vậy bạn? Hình như ko có

Trọng Nghĩa viết 01:41 ngày 01/10/2018

Xin lỗi, mình nhầm sang C++.
Bạn sửa lại như bác trên nói xem sao

anon45952904 viết 01:43 ngày 01/10/2018

newName không vấn đề gì bạn ạ.
Mình tìm đc cách sửa lỗi trên để có code chạy như ý định. Nhưng đoạn code trên là để cho câu hỏi mình chưa giải thích được ấy.

anon45952904 viết 01:47 ngày 01/10/2018

Sorry các bạn! Lỗi này là do bụng đói. Đươc ăn nên đỡ ngâu hơn rồi

Do trong while() được truyền string được khai báo để loop ( char array), còn ngoài while() truyền trực tiếp string ( bằng tay) nên nó khác nhau.

Bài liên quan
0