求助:c编程提示“syntax error:{”

呀二呀 2014-09-18 02:14:37
小弟新手,正在学习c语言,编写了一个结构体的程序,编译出现以下错误:
error C2059: syntax error : '{';
error C2143: syntax error : missing ';' before '{';
error C2143: syntax error : missing ';' before '}';
是在定义camers[2]那行代码时出现这个错误。按照提示的错误信息分析,检查了遍代码,没发现有语法上的问题。
个人觉得可能和初始化camera[2]那行代码有关,但又没个头绪。希望各位CSDN的大牛给点意见!
[code=c]
#include <stdio.h>

int main()
{

typedef struct
{
float foclen;
float fstop;
char brand [30];
}LENS;

LENS cameras[10];
cameras[2]={
500.0,
2.0,
"koda"
};
printf("The jiaojv changdu wei:%f\n",cameras[2].foclen);
printf("The kongjing wei:%f\n",cameras[2].fstop);
printf("The pingpai wei:%s\n",cameras[2].brand);

return 0;
}

[/code]
...全文
24855 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-11-26
  • 打赏
  • 举报
回复
struct point { int x,y; } ; point p1 = {1,2};// {1,2}是初始化表 point p2; int mian(){ p2 = p1; //结构体整体赋值,C语言,早期不可以,现在已经可以了 return 0; }
lm_whales 2014-11-26
  • 打赏
  • 举报
回复
初始化表,通常是常量序列(包括字符串字面值), 有时候也会有变量, 甚至函数调用在里面。
lm_whales 2014-11-26
  • 打赏
  • 举报
回复
C啊,早期的C不可以给结构整体赋值,只能初始化 现在,可以赋值,也可以初始化, 不过只能 用其他结构对象(变量)给结构对象(变量)赋值 不能用初始化表赋值, 初始化表只能用于初始化。 C语言中: 初始化的等号后面的 大括号括起来的,常量(可能还包括变量)序列,称为初始化表。 字符串字面值是一种特殊的初始化表。 对单个内部类型的变量(常量)初始化的常量(变量), (常量)表达式,也是初始化表。

int x= 0; //0 是初始化表
int y =x;  //x 是初始化表
char a[] ="12345"; //"12345"是初始化表
char a[] ={'1','2','3'};//={'1','2','3'};是初始化表
struct {
int x,y;
} point =    {1,2};//  {1,2}是初始化表


struct {
int a,b;
s[10];
} point =    {1,2,"12345"};//  {1,2,"12345"};是初始化表

以上 = 后面部分就是初始化表;
formal1123 2014-10-04
  • 打赏
  • 举报
回复
应该是第18行赋值字符串出错了,你这样赋值只能在初始化时赋值,意思就是在声明时才可以这样赋值。像你这样声明后赋值字符串应该要用strcpy函数 cameras[2].foclen = 232; cameras[2].fstop = 90; strcpy(cameras[2.band],“kado”); 这样赋值应该就没什么问题了
ForestDB 2014-09-23
  • 打赏
  • 举报
回复
可以,只是续行符\在这里是不必要的,因为C是自由语法。 char string[] = "abc\ defg"; 这里的\更有用,相当于 char string[] = "abcdefg";
Code_Fly 2014-09-23
  • 打赏
  • 举报
回复
引用 4 楼 ForestDB 的回复:
LENS cameras[10]; cameras[2]={ 500.0, 2.0, "koda" }; 定义和初始化要放一条语句。
LENS cameras[10]; cameras[2]={ \ 500.0,\ 2.0,\ "koda"\ }; 这样亦可吧
呀二呀 2014-09-21
  • 打赏
  • 举报
回复
引用 8 楼 jikexiyg 的回复:
是的,首先有两对概念你要清楚: 1、声明和定义。他们是有区别的,声明只是告诉编译器存在这个变量,一般用关键字extern来说明是声明变量;而定义除了这些之外还要为变量分配存储空间,还可能为变量赋上初值,即初始化。另外:对同一个变量,声明可以多次,而定义只能一次。 2、初始化和赋值。定义变量的同时赋上初值叫初始化,在定义之后再去给变量赋值就不是初始化了,就是普通的赋值操作了,初始化只有一次,即在定义变量的同时赋值。 char a[30]="apple"; 语句就是初始化啊,在定义字符数组a的同时赋上初始值。初始化操作是比较特殊的赋值操作,对于字符数组c编译器允许用字符串常量来初始化,而在定义之后再给它这样赋值编译器就会报错。 建议你看看《C++ primer》这本书,上面讲的很详细。
你讲的很详细,终于明白了初始化和赋值的区别。谢谢朋友!
sunShinezhuyg 2014-09-19
  • 打赏
  • 举报
回复
是的,首先有两对概念你要清楚: 1、声明和定义。他们是有区别的,声明只是告诉编译器存在这个变量,一般用关键字extern来说明是声明变量;而定义除了这些之外还要为变量分配存储空间,还可能为变量赋上初值,即初始化。另外:对同一个变量,声明可以多次,而定义只能一次。 2、初始化和赋值。定义变量的同时赋上初值叫初始化,在定义之后再去给变量赋值就不是初始化了,就是普通的赋值操作了,初始化只有一次,即在定义变量的同时赋值。 char a[30]="apple"; 语句就是初始化啊,在定义字符数组a的同时赋上初始值。初始化操作是比较特殊的赋值操作,对于字符数组c编译器允许用字符串常量来初始化,而在定义之后再给它这样赋值编译器就会报错。 建议你看看《C++ primer》这本书,上面讲的很详细。
呀二呀 2014-09-18
  • 打赏
  • 举报
回复
引用 6 楼 jikexiyg 的回复:
基本数据类型的变量可以在定义之后赋值,但是数组、结构体等是复合数据类型的,在一般情况下赋值是要具体到成员变量的。char a[30]="apple"是字符数组的初始化,当然可以这样写了。
    //1、数组的初始化、赋值
	char arrCh[30] = {'k', 'o', 'd', 'a'};  //字符数组初始化有这两种方法
	char arrCh[30] = "koda";
	int arrInt[5] = {1, 2, 3, 4, 5};  //整型数组初始化

	int arrInt[5];  //先定义一个整型数组
	arrInt[2] = 3;  //赋值是也只能具体到某个成员变量去赋值

	//arrInt[5] = {1, 2, 3, 4, 5}; //这样赋值就明显不对,定义之后arrInt[5]就表示arrInt数组的第6个元素
	                             //这是也下标越界


    //2、结构体的赋值
	typedef struct 
	{
		float foclen;
		float fstop;
		char brand[30];
	}LENS;

	LENS cameras[10];  //先定义
	//下面赋值就要具体到每个结构体数组中各个成员变量了
	cameras[2].foclen = 232;
	cameras[2].fstop = 90;   

	//但是该结构体中有字符数组作为成员变量,就又要具体到某个字符变量赋值了
	(cameras[2].brand)[0] = 'k';
	(cameras[2].brand)[1] = 'o';
	(cameras[2].brand)[2] = 'd';
	(cameras[2].brand)[3] = 'a';
	//或者这样赋值,直接调用拷贝函数或者其他函数
	strcpy_s(cameras[2].brand, sizeof(cameras[2].brand), "koad"); 
至于你问为什么是这样,我只能说这是C编译器规定的吧,具体我也不知道了!
就是说,复合类型都是声明时初始化,或者之后再给成员赋值。char a[30]="apple"只是因为声明和初始化是一起的,所以能通过编译,而camera[2].brand="apple"是在变量声明后再赋值的,所以不能通过编译。我这样理解对吧?
sunShinezhuyg 2014-09-18
  • 打赏
  • 举报
回复
基本数据类型的变量可以在定义之后赋值,但是数组、结构体等是复合数据类型的,在一般情况下赋值是要具体到成员变量的。char a[30]="apple"是字符数组的初始化,当然可以这样写了。
    //1、数组的初始化、赋值
	char arrCh[30] = {'k', 'o', 'd', 'a'};  //字符数组初始化有这两种方法
	char arrCh[30] = "koda";
	int arrInt[5] = {1, 2, 3, 4, 5};  //整型数组初始化

	int arrInt[5];  //先定义一个整型数组
	arrInt[2] = 3;  //赋值是也只能具体到某个成员变量去赋值

	//arrInt[5] = {1, 2, 3, 4, 5}; //这样赋值就明显不对,定义之后arrInt[5]就表示arrInt数组的第6个元素
	                             //这是也下标越界


    //2、结构体的赋值
	typedef struct 
	{
		float foclen;
		float fstop;
		char brand[30];
	}LENS;

	LENS cameras[10];  //先定义
	//下面赋值就要具体到每个结构体数组中各个成员变量了
	cameras[2].foclen = 232;
	cameras[2].fstop = 90;   

	//但是该结构体中有字符数组作为成员变量,就又要具体到某个字符变量赋值了
	(cameras[2].brand)[0] = 'k';
	(cameras[2].brand)[1] = 'o';
	(cameras[2].brand)[2] = 'd';
	(cameras[2].brand)[3] = 'a';
	//或者这样赋值,直接调用拷贝函数或者其他函数
	strcpy_s(cameras[2].brand, sizeof(cameras[2].brand), "koad"); 
至于你问为什么是这样,我只能说这是C编译器规定的吧,具体我也不知道了!
呀二呀 2014-09-18
  • 打赏
  • 举报
回复
引用 3 楼 jikexiyg 的回复:
不能在结构体变量定以后再给结构体整体赋值,只能直接给其成员赋值,或者在定义变量时直接初始化。如下:
	typedef struct 
	{
		float foclen;
		float fstop;
		char brand [30];
	}LENS;

	//(1)、在定义结构体变量时初始化
	LENS cameras[10] = {0, 0, {12.3, 2.3, "afkjaf"}};//给cameras[0]、cameras[1]赋值为0

	//(2)、定义之后再要赋值就要给结构体成员变量赋值了
	LENS cameras[10];
	cameras[2].foclen = 232;
	cameras[2].fstop = 90;	
	strcpy_s(cameras[2].brand, 30, "koad");  //注意对字符数组的赋值方式

	//另外:对于字符数组赋值也与结构体类似,也不能这样给字符数组这样赋值
	cameras[2].brand = "koda"; //这种赋值方法是错误的
还有点不太明白,为何结构体不能声明后再给整体赋值?而像整型、字符型、浮点型,甚至数组都可以。 还有为什么cameras[2].brand="koda"赋值是不对的?把字符串赋值给字符数组应该是可以的吧,比如我 char a[30]="apple",这样明明是对的啊。比较纳闷,请大牛解释!
ForestDB 2014-09-18
  • 打赏
  • 举报
回复
LENS cameras[10]; cameras[2]={ 500.0, 2.0, "koda" }; 定义和初始化要放一条语句。
sunShinezhuyg 2014-09-18
  • 打赏
  • 举报
回复
不能在结构体变量定以后再给结构体整体赋值,只能直接给其成员赋值,或者在定义变量时直接初始化。如下:
	typedef struct 
	{
		float foclen;
		float fstop;
		char brand [30];
	}LENS;

	//(1)、在定义结构体变量时初始化
	LENS cameras[10] = {0, 0, {12.3, 2.3, "afkjaf"}};//给cameras[0]、cameras[1]赋值为0

	//(2)、定义之后再要赋值就要给结构体成员变量赋值了
	LENS cameras[10];
	cameras[2].foclen = 232;
	cameras[2].fstop = 90;	
	strcpy_s(cameras[2].brand, 30, "koad");  //注意对字符数组的赋值方式

	//另外:对于字符数组赋值也与结构体类似,也不能这样给字符数组这样赋值
	cameras[2].brand = "koda"; //这种赋值方法是错误的
赵4老师 2014-09-18
  • 打赏
  • 举报
回复
偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。” 的方法解决的。
C4Fun 2014-09-18
  • 打赏
  • 举报
回复
typedef 用法有问题! typedef struct _LENS { float foclen; float fstop; char brand [30]; }LENS;

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧