C语言 使用指针、数组和冒泡排序的数据排序程序,存在语法错误



我将如何摆脱这些不允许我编译的语法错误?

这具有正在执行的操作的正确结构,但是这些错误使我无法对其进行测试。

我非常接近测试这个。我做了 int 数组和 int 指针来修复其中一些错误,但在下一个错误的行中执行它们并不能修复它们。

这都是相同类型的错误。

Pointers.c: In function ‘ArrayInitialize’:
Pointers.c:19: error: expected ‘;’ before ‘)’ token
Pointers.c:23: error: expected ‘;’ before ‘)’ token
Pointers.c:25: warning: assignment makes integer from pointer without a cast
Pointers.c: At top level:
Pointers.c:32: error: expected ‘)’ before ‘array’
Pointers.c:44: error: expected ‘)’ before ‘array’
Pointers.c:56: error: expected ‘)’ before ‘array’
Pointers.c:78: error: expected ‘)’ before ‘pointer’
#include <stdio.h>
#include <stdlib.h>
#define SIZE_OF_ARRAY 5
//=============================================================================
    int *IntegerPtr;
    int  ArrayInt[SIZE_OF_ARRAY]; 
    int *ArrayPtr[SIZE_OF_ARRAY];
//----------------------------------------------------------------------------- 
void ArrayInitialize(int *array,int *pointer){
  int i;
  srand(getpid());
  for (i =0, i < SIZE_OF_ARRAY; i++;){
    array[i] = (int)rand();
  for (i =0, i < SIZE_OF_ARRAY; i++;){
        pointer[i] = &array[i];
                                      }
                      }
    }
//-----------------------------------------------------------------------------
void ArrayPrint(ArrayInt array){
 int i;
   for (i =0, int < SIZE_OF_ARRAY; i++;){
    printf("%d : %10d n",i,array[i]);
 }
printf("n");
}
//-----------------------------------------------------------------------------
void ArrayPointerPrint(ArrayInt array){
 int i;
   for (i =0, i < SIZE_OF_ARRAY; i++){
    printf("%d : %10d n",i,pointer[i]);
 }
printf("n");
}
//-----------------------------------------------------------------------------
void ArrayBubbleSort(ArrayInt array){
  int i;
  int j;
  int temp;
  for( i = (SIZE_OF_ARRAY - 1); i >= 0; i-- )
  {
    for( j = 1; j <= i; j++ )
    {
      if( *(array+(j-1)) > *(array+j))
      {
         temp = *array+(j-1));
        *array+(j-1)) = array+(j));
        *array+(j) = temp;
      }
    }
  }
}
//-----------------------------------------------------------------------------
 void PointerBubbleSort(ArrayPtr pointer){
  int i;
  int j;
  int temp;
  for( i = (SIZE_OF_ARRAY - 1); i >= 0; i-- )
  {
    for( j = 1; j <= i; j++ )
    {
      if( *(pointer+(j-1)) > *(pointer+j))
      {
        temp = *pointer+(j-1));
        *pointer+(j-1)) = pointer+(j));
        *pointer+(j) = temp;
      }
    }
  }
}
//----------------------------------------------------------------------------- 
 int main(void) {
    int array[SIZE_OF_ARRAY]; 
    int pointer[SIZE_OF_ARRAY];
    ArrayInitialize(array,pointer);
    ArrayPrint(array);
    PointerBubbleSort(pointer);
    ArrayPointerPrint(pointer);
    ArrayBubbleSort(array);
    ArrayPrint(array);
    ArrayPointerPrint(pointer);
    return(EXIT_SUCCESS);
  }

这个程序中有很多语法错误,你的代码格式并不完全使它易于阅读(例如,缩进非常不一致(。

语法错误为您提供失败的行号。你应该看看那条线,也许还有紧挨着那条线的线,以确定出了什么问题。

例如:

Pointers.c:32:错误:在"数组"之前预期为"(">

第 32 行:

void ArrayPrint(ArrayInt array){

该错误为您提供了一个线索,即在array之前出了点问题。这里的问题是ArrayInt被用作类型。您尚未在任何地方定义此类型。

接下来,你的 for 循环的语法不正确。正确的语法是 for (initial condition; condition; increment) .仔细查看,并将其与您使用的语法进行比较 - 注意使用 ; s 而不是 , s,以及它们的位置(如果您有兴趣,请参阅此问题。

我建议你修复这些错误,然后仔细查看每个错误,并查阅书籍,网络资源和/或Google,看看你应该如何实现你在那里写的内容(例如,搜索"c for loop语法"......或"c数组教程"(。

现在,如果您正在努力解决这些问题,您可能需要尝试使用 LLVM clang编译器,尽管如果您找不到它的 linux 软件包和/或您没有使用最新的 Mac OS X 版本,则可能很难安装。它输出一些更好的错误:

% clang -o foo foo.c
foo.c:17:9: warning: implicit declaration of function 'getpid' is invalid in C99
      [-Wimplicit-function-declaration]
  srand(getpid());
        ^
foo.c:25:18: warning: incompatible pointer to integer conversion assigning to
      'int' from 'int *'; remove & [-Wint-conversion]
      pointer[i] = &array[i];
                 ^ ~~~~~~~~~
foo.c:23:18: warning: expression result unused [-Wunused-value]
    for (i =0, i < SIZE_OF_ARRAY; i++;){
               ~ ^ ~~~~~~~~~~~~~
foo.c:19:16: warning: expression result unused [-Wunused-value]
  for (i =0, i < SIZE_OF_ARRAY; i++;){
             ~ ^ ~~~~~~~~~~~~~
foo.c:32:17: error: unknown type name 'ArrayInt'
void ArrayPrint(ArrayInt array){
                ^
foo.c:35:12: error: expected ';' in 'for' statement specifier
  for (i =0, int < SIZE_OF_ARRAY; i++;){
           ^
foo.c:35:12: error: expected expression
foo.c:35:38: error: expected ')'
  for (i =0, int < SIZE_OF_ARRAY; i++;){
                                     ^
foo.c:35:7: note: to match this '('
  for (i =0, int < SIZE_OF_ARRAY; i++;){
      ^
foo.c:35:39: error: expected expression
  for (i =0, int < SIZE_OF_ARRAY; i++;){
                                      ^
foo.c:44:24: error: unknown type name 'ArrayInt'
void ArrayPointerPrint(ArrayInt array){
                       ^
foo.c:47:36: error: expected ';' in 'for' statement specifier
  for (i =0, i < SIZE_OF_ARRAY; i++){
                                   ^
foo.c:48:29: error: use of undeclared identifier 'pointer'
    printf("%d : %10d n",i,pointer[i]);
                            ^
foo.c:47:16: warning: expression result unused [-Wunused-value]
  for (i =0, i < SIZE_OF_ARRAY; i++){
             ~ ^ ~~~~~~~~~~~~~
foo.c:56:22: error: unknown type name 'ArrayInt'
void ArrayBubbleSort(ArrayInt array){
                     ^
foo.c:78:24: error: unknown type name 'ArrayPtr'
void PointerBubbleSort(ArrayPtr pointer){
                       ^
5 warnings and 10 errors generated.

尝试解决这些问题,然后继续阅读。我会将其余部分标记为剧透,以便您可以先试一试。

...

这里:

for (i =0, int < SIZE_OF_ARRAY; i++;){
<块引用类>

一旦你修复了 for 循环语法,你只需随机地int i应该去的地方。

void ArrayPointerPrint(int* array){
  int i;
  for (i =0; i < SIZE_OF_ARRAY; i++){
    printf("%d : %10d n",i,pointer[i]);
<块引用类>

在这里:编译器问pointer应该是什么?它既不存在于函数的作用域中,也不存在于全局作用域中。我猜你的意思是array.

temp = *array+(j-1);
<块引用类>

你为什么不在这里只使用array[j-1]?虽然它可能在这个特定的行中工作,但当您尝试在作业的左侧使用相同的行时,它肯定不会。你在这个区域也有一些额外的括号。

下面的代码为我编译。不过,仍然有一些警告。你应该谷歌他们。

#include <stdio.h>
#include <stdlib.h>
#define SIZE_OF_ARRAY 5
//=============================================================================
int *IntegerPtr;
int  ArrayInt[SIZE_OF_ARRAY]; 
int *ArrayPtr[SIZE_OF_ARRAY];
//----------------------------------------------------------------------------- 
void ArrayInitialize(int *array,int *pointer){
  int i;
  srand(getpid());
  for (i =0; i < SIZE_OF_ARRAY; i++){
    array[i] = (int)rand();
    for (i =0; i < SIZE_OF_ARRAY; i++){
      pointer[i] = &array[i];
    }
  }
}
//-----------------------------------------------------------------------------
void ArrayPrint(int* array){
  int i;
  for (i =0; i < SIZE_OF_ARRAY; i++){
    printf("%d : %10d n",i,array[i]);
  }
  printf("n");
}
//-----------------------------------------------------------------------------
void ArrayPointerPrint(int* array){
  int i;
  for (i =0; i < SIZE_OF_ARRAY; i++){
    printf("%d : %10d n",i,array[i]);
  }
  printf("n");
}
//-----------------------------------------------------------------------------
void ArrayBubbleSort(int* array){
  int i;
  int j;
  int temp;
  for( i = (SIZE_OF_ARRAY - 1); i >= 0; i-- )
    {
      for( j = 1; j <= i; j++ )
        {
          if( *(array+(j-1)) > *(array+j))
            {
              temp = *array+(j-1);
          array[j-1] = array[j];
  array[j] = temp;
}
}
}
}
//-----------------------------------------------------------------------------
void PointerBubbleSort(int* pointer){
  int i;
  int j;
  int temp;
  for( i = (SIZE_OF_ARRAY - 1); i >= 0; i-- )
    {
      for( j = 1; j <= i; j++ )
        {
          if( *(pointer+(j-1)) > *(pointer+j))
            {
              temp = *pointer+(j-1);
          pointer[j-1] = pointer+(j);
  pointer[j] = temp;
}
}
}
}
//----------------------------------------------------------------------------- 
int main(void) {
  int array[SIZE_OF_ARRAY]; 
  int pointer[SIZE_OF_ARRAY];
  ArrayInitialize(array,pointer);
  ArrayPrint(array);
  PointerBubbleSort(pointer);
  ArrayPointerPrint(pointer);
  ArrayBubbleSort(array);
  ArrayPrint(array);
  ArrayPointerPrint(pointer);
  return(EXIT_SUCCESS);
}

你的两个问题是:

for (i =0, i < SIZE_OF_ARRAY; i++;){
    array[i] = (int)rand();
for (i =0, i < SIZE_OF_ARRAY; i++;){

在这两个循环中,逗号应该是分号,最后一个分号应该丢失。 事实上,你有一个赋值(i = 0后跟一个未使用的比较i < SIZE_OF_ARRAY(,循环条件是i++ != 0(这需要很长时间才能变成假;你可能在它变成假之前很久就崩溃了(,并且没有重新初始化步骤。你也不真的希望两个嵌套循环都索引i - 改用ij。 因此,如果你需要嵌套循环,你可以写:

for (i = 0; i < SIZE_OF_ARRAY; i++)
{
    array[i] = (int)rand();
    for (i = 0; j < SIZE_OF_ARRAY; j++)
    {

但是,在我看来根本不需要嵌套循环:

for (i = 0; i < SIZE_OF_ARRAY; i++)
{
    array[i] = rand();
    pointer[i] = &array[i]; // More on this in a moment
}

编译器还诊断了赋值的问题:

pointer[i] = &array[i];

你正在分配一个指向int的指针(&array[i]((因为int *pointer意味着pointer是指向int的指针,所以pointer[i],相当于*(pointer + i),是一个int(。 从代码来看,看起来您应该在main()声明:

int *pointer[SIZE_OF_ARRAY];

并且功能接口应为:

void ArrayInitialize(int *array, int **pointer)

但是代码的所有其他部分都与此不一致。 我相信它可以保持一致;问题是哪种方式使其保持一致。 根本没有理由使用pointer(我可以看到(,除非它在函数中int **pointer

您有循环语法问题的另一种变体:

for (i =0, int < SIZE_OF_ARRAY; i++;){

这也应该是:

for (i = 0; i < SIZE_OF_ARRAY; i++){

在其他函数中,您使用名称ArrayIntArrayPtr,就好像它们是typedef名称一样,但它们实际上是(未使用的(全局变量。 如果您将它们制作成typedef毕竟,请始终如一地使用它们。 如果你不打算把它们变成typedef,那么去掉它们并修复函数定义。

在交换的排序函数中,您有不匹配的括号:

     temp = *array+(j-1));
    *array+(j-1)) = array+(j));
    *array+(j) = temp;

你使用的符号很奇怪;为什么不只使用数组索引呢?

temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;

工作代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE_OF_ARRAY 5
typedef int *IntegerPtr;
typedef int  ArrayInt[SIZE_OF_ARRAY];
typedef int *ArrayPtr[SIZE_OF_ARRAY];
void PointerBubbleSort(ArrayPtr pointer);
void ArrayBubbleSort(ArrayInt array);
void ArrayPointerPrint(ArrayPtr pointer);
void ArrayPrint(ArrayInt array);
void ArrayInitialize(ArrayInt array, ArrayPtr pointer);
void ArrayInitialize(ArrayInt array, ArrayPtr pointer)
{
    int i;
    srand(getpid());
    for (i = 0; i < SIZE_OF_ARRAY; i++)
    {
        array[i] = (int)rand();
        pointer[i] = &array[i];
    }
}
void ArrayPrint(ArrayInt array)
{
    int i;
    for (i = 0; i < SIZE_OF_ARRAY; i++)
    {
        printf("%d : %10d n", i, array[i]);
    }
    printf("n");
}
void ArrayPointerPrint(ArrayPtr pointer)
{
    int i;
    for (i = 0; i < SIZE_OF_ARRAY; i++)
    {
        printf("%d : %10d n", i, *pointer[i]);
    }
    printf("n");
}
void ArrayBubbleSort(ArrayInt array)
{
    int i;
    int j;
    int temp;
    for (i = (SIZE_OF_ARRAY - 1); i >= 0; i--)
    {
        for (j = 1; j <= i; j++)
        {
            if (array[j-1] > array[j])
            {
                temp = array[j-1];
                array[j-1] = array[j];
                array[j] = temp;
            }
        }
    }
}
void PointerBubbleSort(ArrayPtr pointer)
{
    int i;
    int j;
    int *temp;
    for (i = (SIZE_OF_ARRAY - 1); i >= 0; i--)
    {
        for (j = 1; j <= i; j++)
        {
            if (*pointer[j-1] > *pointer[j])
            {
                temp = pointer[j-1];
                pointer[j-1] = pointer[j];
                pointer[j] = temp;
            }
        }
    }
}
int main(void)
{
    ArrayInt array;
    ArrayPtr pointer;
    ArrayInitialize(array, pointer);
    ArrayPrint(array);
    PointerBubbleSort(pointer);
    ArrayPointerPrint(pointer);
    ArrayBubbleSort(array);
    ArrayPrint(array);
    return(EXIT_SUCCESS);
}

示例输出

0 :  881325466 
1 : 1242393703 
2 :  927466540 
3 : 1493827854 
4 :  533425101 
0 :  533425101 
1 :  881325466 
2 :  927466540 
3 : 1242393703 
4 : 1493827854 
0 :  533425101 
1 :  881325466 
2 :  927466540 
3 : 1242393703 
4 : 1493827854 

修订后的代码

对代码进行细微调整以符合赋值的字母。 特别是,它使用"指向整数的指针"的未使用类型定义来构建"指向整数的五个指针数组"。 它尝试使输出格式与问题的输出精确匹配。尽量避免在输出行(和源代码行(上尾随空格。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
enum { SIZE_OF_ARRAY = 5 };
typedef int    *IntPtr;
typedef int     ArrayInt[SIZE_OF_ARRAY];
typedef IntPtr  ArrayPtr[SIZE_OF_ARRAY];
void PointerBubbleSort(ArrayPtr pointer);
void ArrayBubbleSort(ArrayInt array);
void ArrayPointerPrint(ArrayPtr pointer);
void ArrayPrint(ArrayInt array);
void ArrayInitialize(ArrayInt array, ArrayPtr pointer);
void ArrayInitialize(ArrayInt array, ArrayPtr pointer)
{
    srand(getpid());
    for (int i = 0; i < SIZE_OF_ARRAY; i++)
    {
        array[i] = rand();
        pointer[i] = &array[i];
    }
}
void ArrayPrint(ArrayInt array)
{
    for (int i = 0; i < SIZE_OF_ARRAY; i++)
        printf("%2d : %10dn", i, array[i]);
}
void ArrayPointerPrint(ArrayPtr pointer)
{
    for (int i = 0; i < SIZE_OF_ARRAY; i++)
        printf("%2d : %10dn", i, *pointer[i]);
}
void ArrayBubbleSort(ArrayInt array)
{
    for (int i = (SIZE_OF_ARRAY - 1); i >= 0; i--)
    {
        for (int j = 1; j <= i; j++)
        {
            if (*(array + j-1) > *(array + j))
            {
                int temp = *(array + j-1);
                *(array + j-1) = *(array + j);
                *(array + j) = temp;
            }
        }
    }
}
void PointerBubbleSort(ArrayPtr pointer)
{
    for (int i = (SIZE_OF_ARRAY - 1); i >= 0; i--)
    {
        for (int j = 1; j <= i; j++)
        {
            if (*pointer[j-1] > *pointer[j])
            {
                int *temp = pointer[j-1];
                pointer[j-1] = pointer[j];
                pointer[j] = temp;
            }
        }
    }
}
int main(void)
{
    ArrayInt array;
    ArrayPtr pointer;
    ArrayInitialize(array, pointer);
    puts("---- Initialized array of integers ----");
    ArrayPrint(array);
    PointerBubbleSort(pointer);
    puts("---- Sorted array of pointers ----");
    ArrayPointerPrint(pointer);
    ArrayBubbleSort(array);
    puts("---- Sorted array of integers ----");
    ArrayPrint(array);
    puts("---- Array of pointers ----");
    ArrayPointerPrint(pointer);
    return(EXIT_SUCCESS);
}

修订后的输出

---- Initialized array of integers ----
 0 :  974520281
 1 : 2052070745
 2 :  565640395
 3 : 1955497143
 4 :  950748713
---- Sorted array of pointers ----
 0 :  565640395
 1 :  950748713
 2 :  974520281
 3 : 1955497143
 4 : 2052070745
---- Sorted array of integers ----
 0 :  565640395
 1 :  950748713
 2 :  974520281
 3 : 1955497143
 4 : 2052070745
---- Array of pointers ----
 0 :  974520281
 1 : 2052070745
 2 :  565640395
 3 : 1955497143
 4 :  950748713