syntax error : missing ‘;’ before ‘type’ IN C
我试图完成我的代码。在为数组分配内存之后。我几乎没有错误,因此我无法编译代码。
我想得到你的帮助来完成这个程序谢谢!
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
1>c:\\users\
oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(27): error C2143: syntax error : missing ‘;’ before ‘type’ 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(28): error C2065: ‘text2’ : undeclared identifier 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(28): warning C4047: ‘=’ : ‘int’ differs in levels of indirection from ‘char **’ 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(29): error C2065: ‘text2’ : undeclared identifier 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(36): error C2065: ‘text2’ : undeclared identifier 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(36): error C2109: subscript requires array or pointer type 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(38): error C2143: syntax error : missing ‘;’ before ‘type’ 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(47): error C2065: ‘text2’ : undeclared identifier 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(47): error C2109: subscript requires array or pointer type 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(47): error C2198: ‘gets’ : too few arguments for call 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(50): error C2065: ‘text2’ : undeclared identifier 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(50): warning C4047: ‘function’ : ‘char **’ differs in levels of indirection from ‘int’ 1>c:\\users\ oni\\documents\\visual studio 2010\\projects\\lb11_12\\lb11_12\\lb_11_12_02.c(50): warning C4024: ‘PrintStr2’ : different types for formal and actual parameter 1 ========== Build: 0 succeeded, 1 failed, 0 up–to–date, 0 skipped ========== |
这是我的代码
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
#include <stdio.h>
#include <conio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> #define LINES 4 #define length 100 void SortText1(char **text1); for (i=0 ; i<LINES; i++){ char **text2; for (i=0 ; i<LINES; i++){ char text3[LINES+LINES][length]; printf(“Second string,Please enter %d names (only capital letters,without spaces):”, LINES); PrintStr1(text1); printf(“The first string sorted:\ void PrintStr1(char **text1){ |
- 如果您希望我们查看错误中的行号,请在源代码中包含行号。如果您可以制作一个展示相同问题的较小示例,那将是理想的。
- 错误 C2143 可能重复:语法错误:在 \\’type\\’ 之前缺少 \\’;\\’
- 如何添加行号?
- 当我使用 mingw 编译您的代码时,我没有收到任何错误,但请仔细检查表示 for (k=0 ; i<LINES ; k) 的行
- 哦,没关系。它是 ansi C 而不是 c99。我将在更长的评论中解释。
您收到这些错误是因为您声明的局部变量不在范围的开头。
1
2 3 4 5 6 |
在作用域中间声明变量的能力最初是在 C99 标准中引入的,MS 编译器不支持该功能。
将所有局部变量声明移动到 { 之后和它们所在块中的任何其他语句之前。
- 谢谢我改变了你告诉我的,但我得到了一个新的错误!当我即将进入 if(strcmp(text1[i],text1[i 1]) > 0 ) 时,我收到一条错误消息 “LB11_12.exe 中 0x53e3d442 (msvcr100d.dll) 处的未处理异常:0xC0000005:访问违规读取位置 0xfdfdfdfd.”
- 是的,但是再发一次那个错误,应该用text3来做
在 C89 中,您只能将变量声明放在块的开头。此限制已在 C99 中删除。
但是 Visual Studio 2010 还不支持 C99。所以你必须坚持C89风格:
1
2 3 4 5 6 7 8 |
int main () //use int main()
{ int i; char **text1; char **text2; //Put all the declarations in the beginning // … return 0; } |
您的编译器似乎使用了旧版本的 C 标准。它不允许在块的中间声明。您需要将所有声明上移,以便它们都位于块的第一个可执行语句之前。
- 谢谢我改变了你告诉我的,但我得到了一个新的错误!当我即将进入 if(strcmp(text1[i],text1[i 1]) > 0 ) 时,我收到一条错误消息 “LB11_12.exe 中 0x53e3d442 (msvcr100d.dll) 处的未处理异常:0xC0000005:访问违规读取位置 0xfdfdfdfd.”
当然,只在函数体的开头指定局部变量。否则,C 编译器可能会给您一个编译错误。
- @aschepler:显然它仍然适用于 C 模式下的 VS:stackoverflow.com/questions/15697190/…
- 不一定是函数体。您可以在代码中的任何 \\'{\\’ 之后指定它们。
- VS 默认使用非常古老的标准编译 C 代码。祖伯古要求的条件可能就是这些标准的东西。
- 我仍然不明白我必须做什么。我是个新手,请告诉我出了什么问题,我应该怎么做
- 替换 char **text1;与 char **text1, **text2;并删除 char text3[LINES LINES][length];和 char **text2;
较旧的 C 标准不允许您这样做(而 C 和较新的 C 标准可以这样做)。不过,您可以通过引入一个新主体来使用它:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
void function()
{ int i; i = 0; // Do some more things // AnotherInt is now”out of scope” and cannot be referenced any more |
在 ansi C 中,即 c89 中,您必须先在函数中声明所有变量。
Main 应该改为
1
2 3 4 5 6 7 8 9 10 |
void main ()
{ int i; char **text1; char **text2; char text3[LINES+LINES][length]; // put the rest of your code here } |
如果你想在代码中间声明变量,你必须使用 c99(或者你的编译器可能有另一个选项)。
/这之后的一切都是吹毛求疵。
作为风格问题,您应该将#define 常量(如长度)大写。
你应该声明你的函数是静态的,这样它们就不会污染全局命名空间:
1
2 3 4 |
static void SortText1(char **text1);
static void SortText2(char **text2); static void PrintStr1(char **text1); static void PrintStr2(char **text2); |
Main 应该是 int main(int argv, char** argc) 而不是 void main()
除非您的编译器没有正确定义标准库,否则您不需要包含 malloc.h 和 conio.h。
1
|
for ( k=0 ; i<LINES ; k++)
|
应该把 i 改成 k。
缩进不一致。
您还应该一次编写一小段程序。编写许多函数然后尝试编译它们会导致这样的问题。如果您正在复制别人的作业,那么您当然只会编译一些失败的大页面,但是如果您自己编写,那么在两次编译之间使用短代码会更快。
/结束吹毛求疵
祝你的项目好运。
来源:https://www.codenong.com/18912912/