'''令牌之前的语法错误

时间:2011-12-13 06:11:26

标签: c struct syntax-error typedef

这是代码

#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<pthread.h>
typedef struct std_thread
{
 char name[20];
 int hallno;
 int empid;
 char dept[5];
}std[5];

void *print(void *args)
{
 struct std_thread *data=(struct std_thread *)args;
 printf("My thread id is %ld\n",pthread_self());
 printf("Thread %d is executing\n",args);
 printf("Name\tHall No\tEmployee ID\tDepartment\n");
 printf("--------------------------------------------------------");
 printf("%s\t%d\t%d\t%s\n",data->name,data->hallno,data->empid,data->dept);
}

int main()
{
 pthread_t th[5];
 int empid=2020;
 int hall=1;
 char dept[2]="IT";
 char *names[]={"dinesh","vignesh","pradeep","prasath","mohan"};
 int t;
 int i;
 int status;
 for(i=0;i<5;i++)
 {
   std[i].name=names[i]; //Getting error from this line
   std[i].hallno=hall;   //Error at this line
   hall++;
   std[i].empid=empid;  //Error at this line
   empid++;
   std[i].dept=dept;     //Error at this line
   status=pthread_create(&th[i],NULL,print,(void *)&std[i]);
   if(status)
   {
    printf("Error creating threads\n");
    exit(0);
   }

 }
 pthread_exit(NULL);
}

在编译此代码时,我在'''token'之前收到“语法错误”。这是什么原因?

5 个答案:

答案 0 :(得分:2)

我认为你的意思是typedef在顶部。

你在那里写的内容使得std等效类型与数组中的struct中的五个相同,但是你使用std就像它本身就是一个数组。

从第五行删除单词typedef,它应该更接近工作。

答案 1 :(得分:2)

此声明不符合您的想法:

typedef struct std_thread
{
  ...
}std[5];

这声明struct名为std_thread,然后创建名为typedef的{​​{1}},表示“5个std个对象的数组”。< / p>

您可能想要这两个定义中的一个,以便将名为struct std_thread的全局对象声明为5 std的数组:

struct std_thread

在第一种情况下,我们还创建名为typedef struct std_thread { ... } std_thread; std_thread std[5]; // OR struct std_thread { .. } std[5]; 的{​​{1}}作为typedef的别名;在第二种情况下,我们没有。

此外,正如其他人所说,你不能通过赋值来复制字符数组。您必须使用strcpy(3)strncpy(3)等功能复制它们。使用std_thread时,必须确保目标缓冲区足够大以容纳所需的字符串。另请注意strncpy does not necessarily null-terminate its destination string,请谨慎使用。

答案 2 :(得分:1)

  1. 您正尝试使用赋值来复制字符串:

    std[i].name=names[i]; 
    

    std[i].dept=dept;
    

    不起作用。请改用strcpy或更好strncpy

  2. 您输入了错字:

    std[i].empid=empdid;  //Error at this line 
    

    您没有名为empdid的变种。

答案 3 :(得分:1)

使用字符串复制功能而不是分配char数组。

答案 4 :(得分:0)

此代码:

typedef struct std_thread
{
    char name[20];
    int  hallno;
    int  empid;
    char dept[5];
} std[5];

将类型std声明为5 struct std_thread个结构的数组。

此代码:

int main()
{
[...]
    int i;
    int status;
    for (i = 0; i < 5; i++)
    {
        std[i].name = names[i]; 

假设std是具有数组或指针类型的变量。

您需要删除关键字typedef,以使代码与变量的使用保持一致。

然后你可以开始遇到字符串赋值的问题,你需要使用字符串复制函数等。