同第一种模型实现的功能,字符串排序,但是定义的字符串方式有不同:

#include <stdio.h>
int main()
{
  int i = 0, j = 0;
  int num = 4;
  char buf[30];
  char myArray[10][30] = { "aaaaa","cccccc","bbbbb","222222" };

  printf("排序前:\n");
  for (i = 0; i < num; ++i)
  {
    printf("%s\n", myArray[i]);
  }
  for (i = 0; i < num; ++i)
  {
    for (j = i + 1; j < num; ++j)
    {
      if (strcmp(myArray[i], myArray[j]) > 0)
      {
        strcpy(buf, myArray[i]);               //此处交换的不是地址,而是内存
        strcpy(myArray[i], myArray[j]);
        strcpy(myArray[j], buf);
      }
    }
  }
  printf("排序后:\n");
  for (i = 0; i < num; ++i)
  {
    printf("%s\n", myArray[i]);
  }
  system("pause");
  return 0;
}

假如我们用第第一种模型封装的函数进行输出:

如图所示,直接崩溃。

为什么?

printMyArray函数:

void printMyArray1(char **buf, int num)
{
  int i;
  for (i = 0; i < num; i++)
  {
    printf("%s \n", *(buf + i));
  }
}

(buf+1)在这里代表的并不是下一个字符串首地址,因为myArray是一个二维数组,+1之后步长为300,超过了数组的长度,导致下非法的内存访问。

这样更改后即可

#include <stdio.h>
void printMyArray2(char buf[10][30], int num)
{
  int i;
  for (i = 0; i < num; i++)
  {
    printf("%s \n", *(buf + i));
  }
}
void sortMyArray2(char buf[10][30], int num)
{
  char tmpBuf[30];
  int i = 0, j = 0;
  for (i = 0; i < num; ++i)
  {
    for (j = i + 1; j < num; ++j)
    {
      if (strcmp(buf[i], buf[j]) > 0)
      {
        strcpy(tmpBuf, buf[i]);     //此处交换的不是地址,而是内存
        strcpy(buf[i], buf[j]);
        strcpy(buf[j], tmpBuf);
      }
    }
  }
}
int main()
{
  int i = 0, j = 0;
  int num = 4;
  char myArray[10][30] = { "aaaaa","cccccc","bbbbb","222222" };

  printf("排序前:\n");
  printMyArray2(myArray, num);
  sortMyArray2(myArray, num);
  printf("排序后:\n");
  printMyArray2(myArray, num);
  system("pause");
  return 0;
}
最后修改:2019 年 02 月 27 日
如果觉得我的文章对你有用,请随意赞赏