30/09/2018, 16:01

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
viết 18:14 ngày 30/09/2018

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

Lê Đình Huy viết 18:07 ngày 30/09/2018

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

Trần Trí Dũng viết 18:12 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:05 ngày 30/09/2018

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

char name[20];
Nguyễn Tuấn Tiến viết 18:10 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:08 ngày 30/09/2018

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

Hoài Nam viết 18:03 ngày 30/09/2018

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)

bau nguyen viết 18:17 ngày 30/09/2018

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

bau nguyen viết 18:07 ngày 30/09/2018

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

Xuân Hòa viết 18:10 ngày 30/09/2018

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

Sơn viết 18:03 ngày 30/09/2018

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])

bau nguyen viết 18:07 ngày 30/09/2018

*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

bau nguyen viết 18:05 ngày 30/09/2018

scanf("%s %f",e[i].name, &e[i].sal);

e[i].name o trong nay ne

Sơn viết 18:02 ngày 30/09/2018

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)

bau nguyen viết 18:16 ngày 30/09/2018

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

Chế Vũ Gia Hy viết 18:09 ngày 30/09/2018

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

stackoverflow.com
Midnight Blue

C: differences between char pointer and array

c, arrays, pointers
asked by Midnight Blue on 04:00PM - 26 Aug 09

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

bau nguyen viết 18:02 ngày 30/09/2018

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

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

@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

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

Sơn viết 18:09 ngày 30/09/2018

Mình đã test rồi nhé

bau nguyen viết 18:11 ngày 30/09/2018

Mình đã test rồi nhé

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

Sơn viết 18:17 ngày 30/09/2018

đây nhé

Bài liên quan
0