关于 Visual Studio 2010:语法错误:缺少 ‘;’在 C 中的”类型”之前

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
     for (i=0 ; i<LINES; i++)
     {
        text1[i] =(char*) malloc(length*sizeof(char));
     }
   char **text2; // <<<<<<<<<<<<<<<<<<<
    text2=(char **)malloc(LINES*sizeof(char *));

在作用域中间声明变量的能力最初是在 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。

缩进不一致。

您还应该一次编写一小段程序。编写许多函数然后尝试编译它们会导致这样的问题。如果您正在复制别人的作业,那么您当然只会编译一些失败的大页面,但是如果您自己编写,那么在两次编译之间使用短代码会更快。

/结束吹毛求疵

祝你的项目好运。