1

我试图完成我的代码。为数组分配内存之后。我几乎没有错误,因此我无法编译代码。我想得到你的帮助来完成这个程序谢谢!

1>c:\users\roni\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\roni\documents\visual studio 2010\projects\lb11_12\lb11_12\lb_11_12_02.c(28): error C2065: 'text2' : undeclared identifier
1>c:\users\roni\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\roni\documents\visual studio 2010\projects\lb11_12\lb11_12\lb_11_12_02.c(29): error C2065: 'text2' : undeclared identifier
1>c:\users\roni\documents\visual studio 2010\projects\lb11_12\lb11_12\lb_11_12_02.c(36): error C2065: 'text2' : undeclared identifier
1>c:\users\roni\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\roni\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\roni\documents\visual studio 2010\projects\lb11_12\lb11_12\lb_11_12_02.c(47): error C2065: 'text2' : undeclared identifier
1>c:\users\roni\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\roni\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\roni\documents\visual studio 2010\projects\lb11_12\lb11_12\lb_11_12_02.c(50): error C2065: 'text2' : undeclared identifier
1>c:\users\roni\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\roni\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 ==========

这是我的代码

#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\n");
        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\n");
        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:\n");
    for ( k=0 ; i<LINES ; k++){
        printf("%s ",text1[k]);
    }
    printf("\n");
}

void PrintStr1(char **text1){
    int i;
    printf("The first string of NAMES:\n");
    for ( i=0 ; i<LINES ; i++){
        printf("%s ",text1[i]);
    }
    printf("\n");
}
void PrintStr2(char **text2){
    int i;
    printf("The second string of NAMES:\n");
    for ( i=0 ; i<LINES ; i++){
        printf("%s ",text2[i]);
    }
    printf("\n");
}
4

6 回答 6

8

您收到这些错误是因为您声明的局部变量不在范围的开头。

     for (i=0 ; i<LINES; i++)
     {
        text1[i] =(char*) malloc(length*sizeof(char));
     }
   char **text2; // <<<<<<<<<<<<<<<<<<<
    text2=(char **)malloc(LINES*sizeof(char *));

在作用域中间声明变量的能力最初是在 C99 标准中引入的,MS 编译器不支持该功能。

将所有局部变量声明移动到{使用它们的块中的任何其他语句之前和之后。

于 2013-09-20T09:17:41.140 回答
2

可以肯定的是,只在函数体的开头指定局部变量。否则,C 编译器可能会给您一个编译错误。

于 2013-09-20T09:15:06.113 回答
2

您的编译器似乎使用旧版本的 C 标准。它不允许在块的中间声明。您需要将所有声明上移,以便它们都位于块的第一个可执行语句之前。

于 2013-09-20T09:17:42.767 回答
2

在 C89 中,您只能将变量声明放在块的开头。此限制已在 C99 中删除。

但是 Visual Studio 2010 还不支持 C99。所以你必须坚持C89风格:

int main ()        //use int main()
{
    int i;
    char **text1;
    char **text2;  //Put all the declarations in the beginning
    // ...
    return 0;
}
于 2013-09-20T09:23:18.917 回答
1

较旧的 C 标准不允许您这样做(C++ 和较新的 C 标准可以这样做)。不过,您可以通过引入一个新主体来使用它:

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
}
于 2013-09-20T09:17:38.840 回答
0

在 ansi C 中,即 c89 中,您必须先在函数中声明所有变量。

主要应更改为

void main ()
{
    int i;
    char **text1;
    char **text2;
    char text3[LINES+LINES][length];

    // put the rest of your code here

}

如果你想在代码中间声明变量,你必须使用 c99(或者你的编译器可能有另一个选项)。

/这之后的一切都是吹毛求疵。

作为风格问题,您应该将#define 常量(如长度)大写。你应该声明你的函数是静态的,这样它们就不会污染全局命名空间:

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 除非你的编译器没有正确定义标准库。

for ( k=0 ; i<LINES ; k++)

应该将 i 更改为 k。

缩进不一致。

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

/结束吹毛求疵

祝你的项目好运。

于 2013-09-20T09:34:48.097 回答