传递一个字符串数组并对它们进行排序(在C中)

时间:2016-02-09 02:13:23

标签: c arrays function sorting c-strings

所以我在明天到期的编程任务遇到了麻烦。该程序应该做很多事情,但是当我尝试将一个字符串数组传递给按字母顺序对它们进行排序的函数时,我遇到了问题。在调用Sort函数之前,我打印字符串的功能很好,但是当我在获得随机字符后尝试打印时,有时只打印一个或两个字符串而不是全部三个。以下是我的Sort函数中的代码:

void Sort (char **arr)
{

   char s1[256];
   char s2[256];
   char s3[256];

   strcpy(s1, arr[0]);
   strcpy(s2, arr[1]);
   strcpy(s3, arr[2]);


   if(s1[0] <= s2[0] && s2[0] <= s3[0])
   {
      arr[0] = s1;
      arr[1] = s2;
      arr[2] = s3;
   } 
   else if(s1[0] <= s3[0] && s3[0] <= s2[0])
   {
      arr[0] = s1;
      arr[1] = s3;
      arr[2] = s2;
   }
   else if(s2[0] <= s1[0] && s1[0] <= s3[0])
   {
      arr[0] = s2;
      arr[1] = s1;
      arr[2] = s3;
   }
   else if(s2[0] <= s3[0] && s3[0] <= s1[0])
   {
      arr[0] = s2;
      arr[1] = s3;
      arr[2] = s1;
   }
   else if(s3[0] <= s2[0] && s2[0] <= s1[0])
   {
      arr[0] = s3;
      arr[1] = s2;
      arr[2] = s1;
   }
   else
   {
      arr[0] = s3;
      arr[1] = s1;
      arr[2] = s2;
   }

}

我确信有更简单的方法可以做到这一点,而不是长篇if语句,但我们需要使用我们迄今为止在课堂上学到的内容来制作程序。如果我犯了一些新手错误,我也会道歉,因为我对C语言不熟悉。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

void Sort (char **arr)

了解char **arr的真正含义。 它也可以写成char arr[][] 这对你来说可能更具人性化。

括号内容可以留空,或者您可以在其中有一个数字,表示每个维度的大小。由于您有char s1[256],因此逻辑上您应该在排序功能中执行或以某种方式强制执行char arr[][256]

我相信你的根本问题在于Sort (char **arr)。 当你在函数中执行arr[1]时,编译器不知道在内存中推进指针的距离。当您的函数头为Sort( char arr[][256])时,当您执行arr[1]时,编译器知道将指针移动到内存中256个单位,其中单位是 arr 变量的任何类型的大小被宣布为。 sizeof(char)是1个字节。

现在你不必使用括号,你仍然可以通过Sort( **arr )来做这种情况。对于你的函数中的第一个实例,你会做

arr+(256*0) = s1;   /* wrong, 256 should be a 1 */
arr+(256*1) = s2;   /* wrong, 256 should be a 1 */
arr+(256*2) = s3;   /* wrong, 256 should be a 1 */

以上修正, 根据如何声明变量arr,256应该是1.我的疏忽。

下面是一个示例代码,我使用gcc 4.3.4编译器进行测试,结果输出。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ( int argc, char *argv[] )
{
   char aa[10][256];
   char *p;

   p = *aa;

   printf("sizeof aa        = %d\n", sizeof( aa ) );
   printf("sizeof aa[0]     = %d\n", sizeof( aa[0] ) );
   printf("sizeof *aa       = %d\n", sizeof( *aa ) );
   printf("sizeof aa[0][0]  = %d\n", sizeof( aa[0][0] ) );
   printf("sizeof **aa      = %d\n", sizeof( **aa ) );

   printf("address aa       = %p\n", aa );
   printf("address aa[0]    = %p\n", aa[0] );

   printf("address aa[1]    = %p\n", aa[1] );
   printf("address aa+1     = %p\n", aa+1 );

   printf("\n");

   printf("address of p     = %p\n", p );
   printf("address of p+1   = %p\n", p+1 );
   printf("address of p+256 = %p\n", p+256 );
}

输出:

sizeof aa        = 2560
sizeof aa[0]     = 256
sizeof *aa       = 256
sizeof aa[0][0]  = 1
sizeof **aa      = 1
address aa       = 0x7ffd38d602a0
address aa[0]    = 0x7ffd38d602a0
address aa[1]    = 0x7ffd38d603a0
address aa+1     = 0x7ffd38d603a0

address of p     = 0x7ffd38d602a0
address of p+1   = 0x7ffd38d602a1
address of p+256 = 0x7ffd38d603a0