为什么给定的 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); }