仅通过C中的指针在字符串数组之间交换

时间:2015-08-09 14:34:12

标签: c arrays string sorting pointers

我需要绘制一个接收指针数组(到字符串)的函数,并按字符串的长度对指针进行排序。最短的字符串将位于第一位,依此类推。我尝试了以下代码,但它不起作用:

void Q5(){
  char str[MAXL][MAXC];
  int i;
  char** p;
  printf("Please enter %d Strings max length = %d\n",MAXL,MAXC);
  for (i = 0; i < MAXL; i++){
    scanf("%s", str[i]);
  }
  p = &str;
  sort_String(p,MAXL);
  printf("\n");
  for (i = 0; i < MAXL; i++){
    printf("%s", str[i]);
    printf("\n");
  }
}

void sort_String(char* str,int size){
char* tempP=*str;
char* i,*j;
for (i=str; i < str+size;i++){
    for (j=i+1; j < str+size; j++){
        if (strlen(i) > strlen(j)){
            tempP = j;
            j = i;
            i = tempP;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

要实现您所说的动态malloc所需的部分,您可以使用此代码。但是您无法更改不允许的阵列位置(位置)。

// L-> number of strings
// C-> character needed

char **str=malloc(sizeof(char*)*L);
for(i=0;i<MAXL;i++)
  str[i]=malloc(sizeof(char)*C);

然后您可以简单地应用您编写的冒泡排序。 您需要在排序函数中传递char**

不需要迭代sort函数中的指针变量。如果按照我的提议动态分配,那么你可以这样编码: -

void sort_String(char** str,int size)
{
char* tempP;
int i,j;
for (i=0; i < size;i++){
    for (j=i+1; j < size; j++){
        if (strlen(str[i]) > strlen(str[j])){
            tempP = str[j];
            str[j ]= str[i];
            str[i] = tempP;
        }
    }
}
}

虽然没有给出正确的代码,但是有一些问题,例如Q5()&#39; s }缺失。举MCV示例。

注意:我假设您使用的是c编译器。这就是我避免施法的原因。在C中,您不需要转换malloc的返回值。 malloc返回的void指针自动转换为正确的类型。但是,如果您希望使用C ++编译器编译代码,则需要进行强制转换。

答案 1 :(得分:0)

指针数组与2D数组不是同一个字符串,即使它们用于获取值也是如此。为了能够交换字符串,您必须有一个指针数组。这是对您的代码的评论性快速修复,因为您距离它不远:

void Q5(){
  char str[MAXL][MAXC]; // Ok a 2D array is nice to read the string
  int i;
  char* p[MAXL]; // the array of MAXL pointers
  printf("Please enter %d Strings max length = %d\n",MAXL,MAXC);
  for (i = 0; i < MAXL; i++){
    scanf("%s", str[i]);       // the string is read
    p[i] = str[i];             // and the array of pointers is initialized
  }
  sort_String(p,MAXL);
  printf("\n");
  for (i = 0; i < MAXL; i++){
    printf("%s", p[i]);       // only p has been sorted, str is unchanged
    printf("\n");
  }
}

void sort_String(char** str,int size){ // takes an array of pointers as first parameter
char* tempP;
int i, j;
for (i=0; i < size;i++){   // ok for a bubble sort
    for (j=i+1; j < size; j++){
        if (strlen(str[i]) > strlen(str[j])){  // compare length of pointed strings
            tempP = str[j];             // swap
            str[j] = str[i];
            str[i] = tempP;
        }
    }
}

我认为MAXLMAXC都是常数值(#define