Poll: Kiểm tra kiến thức C - 1.3

Các bạn thảo luận đáp án nhé, bài test lấy từ http://www.indiabix.com/online-test/c-programming-test/11

3.Point out the error in the following program.

#include<stdio.h>
int main()
{
    struct emp
    {
        char name[20];
        float sal;
    };
    struct emp e[10];
    int i;
    for(i=0; i<=9; i++)
        scanf("%s %f", e[i].name, &e[i].sal);
    return 0;
}
  • A. Suspicious pointer conversion
  • B. Floating point formats not linked (Run time error)
  • C. Cannot use scanf() for structures
  • D. Strings cannot be nested inside structures
5 Likes

Câu này hình như đề sai, mình chạy thử thấy không bị lỗi.

3 Likes

nhìn code thì không hiểu ?
chạy code thì k thấy lỗi gì

1 Like

sai ở chỗ scanf thì phải
cần địa chỉ mà … sao lại e[i].name ?

e[i].name là con trỏ rồi.

char name[20];
2 Likes

Struct không thể viết trong main được phải không anh @Itd

1 Like

Được em, nó giảm cái scope của struct lại. Chỉ dùng được trong hàm main thôi.

2 Likes

Theo em bài này lỗi ở phần scanf ở phần biến sal.
Tách ra scanf có thể dùng cho char name[20]
Rồi sẽ dùng 1 biến char ctam rồi dùng lệnh gets(ctam) thay cho scanf rồi gán biến sal = atoi(ctam)

Bài này sai ở e[i].name trong hàm scanf. Fai là &e[i].name

e[i].name sao lại là con trỏ đc anh?

Ta có int a[100]; chẳng hạn thì a tương đương với &a[0], nói sai mong mọi người đừng ném gạch, lâu em ko đụng đến C rồi :smiley:

bản thân mảng là con trỏ nhé ban. e là con trỏ trỏ đến phần tử đầu tiên của mảng(e==&e[0])

*p == e ==&e[0]
nhưng trên đề kia là e[i].name nhé bạn.
e[i].name chỉ là giá trị của nó thôi.
nếu muốn biểu diễn là con trỏ thì fai viết là (e+i).name hoac &e[i].name nhé bạn

e[i].name o trong nay ne

Chuỗi là mảng kí tụ nhé, nên e[i].name cũng là con trỏ bạn ạ.
thường thì với int thì ta sẽ viết: scanf("%d", &i), nhưng với chuỗi thì chỉ cần viết scanf("%s", e[i].name là được)

chuỗi cũng là mảng ký tự nhưng e[i] không fai là con trỏ bạn nhé…
vd: char a[10];
thì a coi là con trỏ, nó chưa địa chỉ phần tử đầu tiên
a[i] là giá trị phần tử thứ i trong mảng.
bạn đừng nhầm

thật ra cả 2 đều sai mảng là mảng (array), con trỏ là con trỏ (pointer), hai cái đó khác nhau hoàn toàn :smile:


http://www.programming-techniques.com/2011/08/difference-between-array-and-pointer-in.html

@baudiachatb mình thấy bạn bị nhầm rồi e[i].name ở đây kiểu char[], nên nó không cần dấu & đằng trước

mình ko hề nói array là pointer nhé

như mình giải thích ở trên. mình nghĩ là mình ko nhầm:grinning:

Mình đã test rồi nhé :grin:

bạn thử thay e[0].name bằng e[1].name trong hàm scanf và printf xem có chạy ko?

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