为什么给定的 C 代码不正确 运行?
Why is this given C code not running properly?
我编写了这段接受用户输入然后将其打印出来的代码,但它无法正常工作。它只接收姓名,但不接收工人的年龄或工资。
#include <stdio.h>
#include <stdlib.h>
struct worker
{
char sri[100];
int age;
double salary;
};
int main()
{
struct worker *ptr;
int n;
printf("enter number of employy ");
scanf("%d", &n);
//allocating memory for n ;
ptr = (struct worker *)malloc(n * sizeof(struct worker));
for (int i = 0; i < n; ++i)
{
printf("For employee: %d \n ", i+1);
printf("Enter your name : ");
scanf("%s\n", (ptr + i)->sri);
printf("Enter salary:\n ");
scanf("%lf \n", (ptr + i)->salary);
printf("Enter age : \n");
scanf("%d \n", (ptr + i)->age);
}
for (int i = 0; i < n; ++i)
{
printf("Employee %d: ", i+1);
printf("name =%s ", (ptr + i)->sri);
printf("age = %d, ", (ptr + i)->age);
printf("salary = %.2lf\n", (ptr + i)->salary);
}
free(ptr);
return 0;
}
关于您的程序有几件事要说,但让我们从导致它失败的部分开始 - 这两行:
scanf("%lf \n", (ptr + i)->salary);
scanf("%d \n", (ptr + i)->age);
(ptr + i)->salary
是一个 double 但这里 scanf
需要一个 pointer 到 double
(ptr + i)->age
是一个 int 但这里 scanf
需要一个指向 int
的 pointer
如果您没有收到编译器警告,您确实需要提高编译器警告级别。例如对于 gcc
你应该至少使用 -Wall -Werror
。在那种情况下,您会被告知类似以下内容:
main.cpp: In function 'main':
main.cpp:36:10: error: format '%lf' expects argument of type 'double *', but argument 2 has type 'double' [-Werror=format=]
36 | scanf("%lf \n", (ptr + i)->salary);
| ~~^ ~~~~~~~~~~~~~~~~~
| | |
| double * double
main.cpp:38:9: error: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Werror=format=]
38 | scanf("%d \n", (ptr + i)->age);
| ~^ ~~~~~~~~~~~~~~
| | |
| int * int
cc1: all warnings being treated as errors
告诉你一切!
其他评论
始终检查 scanf
返回的值 - 如:
scanf("%d", &n); --> if (scanf("%d", &n) != 1) { // error handling }
不要将 space 或 \n
放在 scanf
格式字符串的末尾。它会给你意想不到的行为。
在 scanf
中使用 %s
时 始终 设置大小限制。
所以:
scanf("%s\n", --> scanf("%99s",
不要强制转换 malloc
返回的值。所以而不是
ptr = (struct worker *)malloc(n * sizeof(struct worker));
做
ptr = malloc(n * sizeof(struct worker));
或更好
ptr = malloc(n * sizeof *ptr);
为了更好的可读性做
(ptr + i)->age --> ptr[i].age
回到原来的问题。
而不是:
scanf("%d \n", (ptr + i)->age);
做
if (scanf("%d", &ptr[i].age) != 1) { exit(1); }
我编写了这段接受用户输入然后将其打印出来的代码,但它无法正常工作。它只接收姓名,但不接收工人的年龄或工资。
#include <stdio.h>
#include <stdlib.h>
struct worker
{
char sri[100];
int age;
double salary;
};
int main()
{
struct worker *ptr;
int n;
printf("enter number of employy ");
scanf("%d", &n);
//allocating memory for n ;
ptr = (struct worker *)malloc(n * sizeof(struct worker));
for (int i = 0; i < n; ++i)
{
printf("For employee: %d \n ", i+1);
printf("Enter your name : ");
scanf("%s\n", (ptr + i)->sri);
printf("Enter salary:\n ");
scanf("%lf \n", (ptr + i)->salary);
printf("Enter age : \n");
scanf("%d \n", (ptr + i)->age);
}
for (int i = 0; i < n; ++i)
{
printf("Employee %d: ", i+1);
printf("name =%s ", (ptr + i)->sri);
printf("age = %d, ", (ptr + i)->age);
printf("salary = %.2lf\n", (ptr + i)->salary);
}
free(ptr);
return 0;
}
关于您的程序有几件事要说,但让我们从导致它失败的部分开始 - 这两行:
scanf("%lf \n", (ptr + i)->salary);
scanf("%d \n", (ptr + i)->age);
(ptr + i)->salary
是一个 double 但这里 scanf
需要一个 pointer 到 double
(ptr + i)->age
是一个 int 但这里 scanf
需要一个指向 int
如果您没有收到编译器警告,您确实需要提高编译器警告级别。例如对于 gcc
你应该至少使用 -Wall -Werror
。在那种情况下,您会被告知类似以下内容:
main.cpp: In function 'main':
main.cpp:36:10: error: format '%lf' expects argument of type 'double *', but argument 2 has type 'double' [-Werror=format=]
36 | scanf("%lf \n", (ptr + i)->salary);
| ~~^ ~~~~~~~~~~~~~~~~~
| | |
| double * double
main.cpp:38:9: error: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Werror=format=]
38 | scanf("%d \n", (ptr + i)->age);
| ~^ ~~~~~~~~~~~~~~
| | |
| int * int
cc1: all warnings being treated as errors
告诉你一切!
其他评论
始终检查 scanf
返回的值 - 如:
scanf("%d", &n); --> if (scanf("%d", &n) != 1) { // error handling }
不要将 space 或 \n
放在 scanf
格式字符串的末尾。它会给你意想不到的行为。
在 scanf
中使用 %s
时 始终 设置大小限制。
所以:
scanf("%s\n", --> scanf("%99s",
不要强制转换 malloc
返回的值。所以而不是
ptr = (struct worker *)malloc(n * sizeof(struct worker));
做
ptr = malloc(n * sizeof(struct worker));
或更好
ptr = malloc(n * sizeof *ptr);
为了更好的可读性做
(ptr + i)->age --> ptr[i].age
回到原来的问题。
而不是:
scanf("%d \n", (ptr + i)->age);
做
if (scanf("%d", &ptr[i].age) != 1) { exit(1); }