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); void SortText2(char **text2); void PrintStr1(char **text1); void PrintStr2(char **text2); void main (){ int i; char **text1; text1=(char **)malloc(LINES*sizeof(char *)); if(!text1){ // Terms - if there is not enough memory,print error msg and exit the program. printf("alloc failed\ "); return ; } for (i=0 ; i<LINES; i++){ text1[i] =(char*) malloc(length*sizeof(char)); } char **text2; text2=(char **)malloc(LINES*sizeof(char *)); if(!text2){ // Terms - if there is not enough memory,print error msg and exit the program. printf("alloc failed\ "); return ; } for (i=0 ; i<LINES; i++){ text2[i] =(char*) malloc(length*sizeof(char)); } char text3[LINES+LINES][length]; printf("First string,Please enter %d names (only capital letters,without spaces):", LINES); for ( i=0 ; i<LINES ; i++){ gets(text1[i]); } printf("Second string,Please enter %d names (only capital letters,without spaces):", LINES); for ( i=0 ; i<LINES ; i++){ gets(text2[i]); } PrintStr1(text1); PrintStr2(text2); SortText1(text1); system("pause"); return ; } void SortText1(char **text1){ int i,j,k; for (i=LINES-1 ; i>0 ; i--){ for ( j=0 ; j<i ; j++ ){ if(strcmp(text1[i],text1[i+1]) > 0 ){ char *temp=text1[i+1]; text1[i+1]=text1[i]; text1[i]=temp; } } } printf("The first string sorted:\ "); for ( k=0 ; i<LINES ; k++){ printf("%s",text1[k]); } printf("\ "); } void PrintStr1(char **text1){ int i; printf("The first string of NAMES:\ "); for ( i=0 ; i<LINES ; i++){ printf("%s",text1[i]); } printf("\ "); } void PrintStr2(char **text2){ int i; printf("The second string of NAMES:\ "); for ( i=0 ; i<LINES ; i++){ printf("%s",text2[i]); } printf("\ "); } |
您收到这些错误是因为您声明的局部变量不在范围的开头。
1 2 3 4 5 6 |
在作用域中间声明变量的能力最初是在 C99 标准中引入的,MS 编译器不支持该功能。
将所有局部变量声明移动到
在 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 标准。它不允许在块的中间声明。您需要将所有声明上移,以便它们都位于块的第一个可执行语句之前。
当然,只在函数体的开头指定局部变量。否则,C 编译器可能会给您一个编译错误。
较旧的 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 { int AnotherInt = 33; AnotherInt += i; // Can still reference i here } // 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。
缩进不一致。
您还应该一次编写一小段程序。编写许多函数然后尝试编译它们会导致这样的问题。如果您正在复制别人的作业,那么您当然只会编译一些失败的大页面,但是如果您自己编写,那么在两次编译之间使用短代码会更快。
/结束吹毛求疵
祝你的项目好运。